Skip to content

research(meta-orchestrator): SKILL.md §5 row 3 vs worker-dispatch anti-pattern drift - #265

Closed
artyhoo wants to merge 1 commit into
stagingfrom
research/skill-row3-vs-worker-dispatch-antipattern
Closed

research(meta-orchestrator): SKILL.md §5 row 3 vs worker-dispatch anti-pattern drift#265
artyhoo wants to merge 1 commit into
stagingfrom
research/skill-row3-vs-worker-dispatch-antipattern

Conversation

@artyhoo

@artyhoo artyhoo commented May 28, 2026

Copy link
Copy Markdown
Owner

Summary

Trigger

Maintainer 2026-05-29 hit the friction firsthand: meta-orchestrator generated Mode B paste-into-fresh-tab dispatch for parallel Sub-waves A+B of aif-handoff bridge R-phase, despite umbrella declaring «Mode A inline R-phase». Asked: «is this manual setup actually required?» — turns out two §5 rules contradict.

Scope

  • In scope: identifying the drift, reconstructing origin commits (07ecfd6 row 3 + 09c245a anti-pattern §348), surveying upstream Superpowers norm, analysing candidates, recommending C with falsifier.
  • Not in scope: implementing the SKILL.md edit. That is a follow-up I-phase PR once maintainer clarifies F.3 author intent. §8 backward-check lists the I-phase edit targets (SKILL.md:322 + :347-348 + :454 + meta-kickoff.template.md §4 dispatch-routing).

Test plan

This is an R-phase research patch — no code, no tests. Pre-push hooks pass:

  • principle 10 research-patch scope annotation: <!-- scope:meta-orchestrator-SKILL.md-§5-row-3-vs-worker-dispatch-via-subagent -->
  • markdownlint clean
  • all skill drift checks pass
  • all 191 audit-ai-docs tests pass

§1.7 PR-body authoring mandate

Note: this PR's target file is docs/meta-factory/research-patches/** only, NOT in the CI substance gate trigger paths per .github/workflows/discipline-self-check.yml:11-26. Per umbrella convention this §1.7 section is prose-discipline only, not CI-backstopped. The commit message body contains full Forward+Backward sections with file:line citations per phase-research-coverage.md §1.7; reproduced here for PR-body convenience:

§1.7 Forward-check applied

Forward-check across active disciplines per .claude/rules/. doc-authority-hierarchy.md §5 — research-patch folder-level header pattern, no per-file Authoritative-for needed (.claude/rules/doc-authority-hierarchy.md:103). phase-research-coverage.md §1 6-item checklist run with documented coverage of own-stack sweep + adversarial counter-prompt + file:line citations per claim (patch §3.1-§3.7); DeepWiki/WebSearch beyond Superpowers omitted with rationale at patch §3.3. phase-research-coverage.md §1.11 verify-against-source-of-truth: origin commits verified via git log -S + git show (commits 07ecfd6 and 09c245a, patch §2.1-§2.2, file:line docs/meta-factory/research-patches/2026-05-29-skill-row3-vs-worker-dispatch-antipattern.md:65-78). phase-research-coverage.md §1.12 reasoned-recommendation: §6 leads with verdict + 5-point rationale + Falsifier, no option-dump (.claude/rules/phase-research-coverage.md:67). build-first-reuse-default.md §1 — Candidate C is REUSE preserving SSOT #65 adoption (.claude/rules/build-first-reuse-default.md:30). reviewer-discipline.md §2 — §6 Falsifier surfaces F.3 author intent as maintainer DECISION-NEEDED, does not unilaterally pick (.claude/rules/reviewer-discipline.md:29). no-paid-llm-in-ci.md — all candidates are deterministic SKILL.md edits, no CI LLM proposed (.claude/rules/no-paid-llm-in-ci.md:14).

§1.7 Backward-check applied

Sweep of existing artefacts under Candidate C edit's proposed scope. SKILL.md:322 row 3 + SKILL.md:347-348 anti-pattern = direct edit targets. SKILL.md:454 («from the worktree rules-as-tests-aif-meta-orchestrator-iphase») = prose referencing manual-worktree pattern, identified as I-phase follow-up (patch §8). meta-kickoff.template.md §4 {{DISPATCH_INSTRUCTIONS}} (.claude/skills/meta-orchestrator/templates/meta-kickoff.template.md:61) = generator-side template needing dispatch-routing update if C approved. placeholders.md:24 already consistent with Candidate C wording, no edit needed (.claude/skills/meta-orchestrator/references/placeholders.md:24). parallel-subwave-isolation.md §4 N7 — explicit REFERENCE to SSOT #65 + CC isolation:"worktree" is fully consistent with Candidate C; Candidate B contradicts this rule (.claude/rules/parallel-subwave-isolation.md:38). No artefact silently superseded.

Prior-art: prior-art-evaluations.md#65 (using-git-worktrees REFERENCE — Candidate C preserves this adoption; Candidate B contradicts it). prior-art-evaluations.md#64 (subagent-driven-development ADOPT VOCABULARY — Candidate C aligns with the inline Task-tool dispatch pattern this row references).

…r-dispatch-via-subagent drift

Identifies a load-bearing drift in .claude/skills/meta-orchestrator/SKILL.md §5:
row 3 (Dispatch tree line 322) and the anti-pattern at line 348 contradict on
parallel R-phase Worker dispatch. The conflict surfaces as recurring maintainer
friction (manual `git worktree add` + 4 fresh tab pastes per parallel R-phase
umbrella).

Evidence per phase-research-coverage.md §1:
- SSOT consult: §3.1 verifies the project ALREADY adopted Superpowers SSOT #64
  (subagent-driven-development) + #65 (using-git-worktrees). Both are REUSE
  verdicts dogfooding upstream's parallel-dispatch + worktree-isolation norms.
- Superpowers upstream norm: §3.2 quotes verbatim from `dispatching-parallel-agents`
  line 70-74 (in-session Task() dispatch for write tasks) and `using-git-worktrees`
  Red Flag #1 line 203 («manual `git worktree add` when native primitive available
  = the #1 mistake»). Our anti-pattern §348 instructs the OPPOSITE on both axes.
- Origin git log: §2 reconstructs row 3 (commit 07ecfd6, original BUILD) + anti-pattern
  §348 (commit 09c245a, F.3 UX) — different decisions, F.3 UX added §348 on top of
  existing row 3 without flagging the conflict.

Four resolution candidates analysed (§4), per-candidate matrix (§5):
- A: Row 3 wins (anti-pattern narrows to non-doc writes)
- B: Anti-pattern wins (row 3 deletes; manual paste required)
- **C: Hybrid — `isolation:"worktree"` carve-out gates Agent-tool dispatch** ← recommended
- D: Tier-distinguish (does not resolve user-experienced friction)

§6 recommends Candidate C: preserves SSOT #64+#65 dogfood, aligns with adopted
upstream's explicit norm, BFR-consistent. Falsifier explicit: wrong if maintainer
clarifies F.3 author intent was literal session-depth, accepting BFR cost against
Superpowers norm — that is a legitimate prerogative but requires explicit deviation
rationale.

§9 self-application: this patch is single Sub-wave Mode A inline R-phase (SKILL.md
row 1, unambiguous case); no §348 violation in its own authorship channel.
§10 surfaces DECISION-NEEDED for maintainer on F.3 author intent + lists I-phase
edits if Candidate C approved.

### §1.7 Forward-check applied

Forward-check across active disciplines per .claude/rules/. Each check carries
file:line evidence per phase-research-coverage.md §1.7. doc-authority-hierarchy.md
§5 — research-patch folder-level header pattern, no per-file Authoritative-for
needed (`.claude/rules/doc-authority-hierarchy.md:103`). phase-research-coverage.md
§1 6-item checklist run with documented coverage of own-stack sweep + adversarial
counter-prompt + file:line citations per claim (patch §3.1-§3.7 + see-also section);
DeepWiki/WebSearch beyond Superpowers omitted with rationale at patch §3.3.
phase-research-coverage.md §1.11 verify-against-source-of-truth: origin commits
verified via `git log -S` + `git show` (commits 07ecfd6 and 09c245a, patch §2.1-§2.2,
file:line `docs/meta-factory/research-patches/2026-05-29-skill-row3-vs-worker-dispatch-antipattern.md:65-78`).
phase-research-coverage.md §1.12 reasoned-recommendation: §6 leads with verdict
+ 5-point rationale + Falsifier, no option-dump (`.claude/rules/phase-research-coverage.md:67`).
build-first-reuse-default.md §1 — Candidate C is REUSE preserving SSOT #65 adoption
(`.claude/rules/build-first-reuse-default.md:30`). reviewer-discipline.md §2 —
§6 Falsifier surfaces F.3 author intent as maintainer DECISION-NEEDED, does not
unilaterally pick (`.claude/rules/reviewer-discipline.md:29`). no-paid-llm-in-ci.md
— all candidates are deterministic SKILL.md edits, no CI LLM proposed
(`.claude/rules/no-paid-llm-in-ci.md:14`).

### §1.7 Backward-check applied

Sweep of existing artefacts under Candidate C edit's proposed scope. SKILL.md:322
row 3 + SKILL.md:347-348 anti-pattern = direct edit targets. SKILL.md:454 («from
the worktree rules-as-tests-aif-meta-orchestrator-iphase») = prose referencing
manual-worktree pattern, identified as I-phase follow-up (patch §8). meta-kickoff.template.md
§4 {{DISPATCH_INSTRUCTIONS}} (`.claude/skills/meta-orchestrator/templates/meta-kickoff.template.md:61`)
= generator-side template needing dispatch-routing update if C approved.
placeholders.md:24 already consistent with Candidate C wording, no edit needed
(`.claude/skills/meta-orchestrator/references/placeholders.md:24`).
parallel-subwave-isolation.md §4 N7 — explicit REFERENCE to SSOT #65 + CC
`isolation:"worktree"` is fully consistent with Candidate C; Candidate B contradicts
this rule (`.claude/rules/parallel-subwave-isolation.md:38`). No artefact silently
superseded.

Prior-art: prior-art-evaluations.md#65 (`using-git-worktrees` REFERENCE — Candidate C preserves this adoption; Candidate B contradicts it). prior-art-evaluations.md#64 (`subagent-driven-development` ADOPT VOCABULARY — Candidate C aligns with the inline Task-tool dispatch pattern this row references).
@artyhoo

artyhoo commented May 29, 2026

Copy link
Copy Markdown
Owner Author

Superseded by dispatch-worktree-automation umbrella (.claude/orchestrator-prompts/dispatch-worktree-automation/kickoff.md, local — orchestrator-prompts gitignored).

Why superseded: this R-phase identified SKILL.md §5 row 3 vs anti-pattern §348 drift and recommended Candidate C (Agent({isolation:"worktree"}) carve-out as permitted channel). The verdict was applied via /tmp/skill-edit.py 2026-05-29 and then reverted via /tmp/skill-revert.py the same day because the subagent-channel turned out not to match maintainer operational preference (visibility per fresh CC tab + separate Opus quota window). Working tree restored to original.

Drift identification stands — §5 row 3 + anti-pattern §348 conflict on parallel R-phase write-Worker dispatch is real and documented. Superseding umbrella reframes the question from "which channel?" (this PR's surface) to "how does the worktree itself come into being without manual maintainer commands?" (broader surface; channel choice is downstream).

Successor R-phase evaluates 7 candidates including the original Candidate B/C path plus 6 alternatives (embedded STEP 0 paste-block · external helper script · PreToolUse hook · native CC WorktreeCreate · fs-watcher daemon · hybrid). Verdict pending dispatch.

Closing as superseded, not as wrong — the analysis is sound; the operational verdict shifted with new context.

@artyhoo artyhoo closed this May 29, 2026
artyhoo added a commit that referenced this pull request Sep 2, 2026
…ail mechanically (#1576)

* feat(kickoff-gates): close two authoring traps that render as success

Both measured live 2026-09-02 while authoring the beta-docs-showcase BS0
stage kickoff. Neither produced any warning at any channel.

Trap 1 — the CANON symlink swallows the commit. Writing a new file under
.claude/orchestrator-prompts/<umbrella>/ and running `git add` in a LATER,
separate step commits a SYMLINK: link-coordination.sh:75 adopts every
UNTRACKED file there into $CANON first. Commit 9e046c6d55 carried
`120000 blob 2d02772193b2b6c1ba2301edf3cc00a3e2902640` while the 232-line
kickoff existed only in $CANON. `git status` showed a normal path, `wc -l`
read through the link, markdownlint reported `0 error(s)` on the linked
target, the spec validator passed. Damage is deferred — the commit is
worthless as a copy, so a later $CANON cleanup destroys the only one.

  Gate: .husky/pre-commit CANON-symlink section (error, fail=1) — the
  earliest reachable channel, since edit-time cannot see a symlink that
  does not exist yet. Error not warning per attention-is-not-a-mechanism.md
  §1: the failure is silent and the fix is unambiguous.
  Backstop: principle 44 arm A (`git ls-files -s` mode 120000), for commits
  husky never runs — aif-container work.

Trap 2 — a near-miss filename makes the quality gate skip the file and
report green. `kickoff-bs0.md` fails STAGE_KICKOFF_RE (`[a-z]` consumes
`b`, then `\d` meets `s`), so it was classified as a sidecar beside
`kickoff-amendments.md` and principle 12's citation gate never examined it;
the suite passed having checked nothing about it. check-kickoff-traps.sh
matched the same two-way split and exited 0 in silence — the hook carried
the blindness it exists to close.

  Gate: check-kickoff-traps.sh arm 3 — edit-time, the only channel firing
  BEFORE dispatch (which can precede any push). Its stage test is now a
  bash regex mirroring kickoff-population.ts:34 instead of an unbounded
  `case` glob, closing a latent twin divergence (`kickoff-b0-notes.md` was
  admitted as a stage there while the TS SSOT called it unrecognised).
  Backstop: principle 44 arm B over the on-disk population.

No regex is re-implemented: classifyKickoffName in kickoff-population.ts is
the single SSOT both channels resolve against (#sync-by-copy-paste,
dual-implementation-discipline.md §8).

Population swept 2026-09-02 (37 kickoff-* files): 29 stage / 6 dotted
sidecar / 1 exact sidecar / 1 pre-existing near-miss —
defer-reflex-detection/kickoff-stage-2-and-3.md, a genuine dispatch input
under a name no channel ever recognised. Untracked, so it never reached
staging; its umbrella is closed. Grandfathered by explicit allowlist
(principle 12 EXEMPT_LIST precedent), asserted by name in both suites.

Paired negatives, live-fired before shipping (not only synthetic strings):
a staged mode-120000 entry and a real kickoff-bs0.md both turn principle 44
red with actionable messages; the pre-commit section exits 1 on the same
staged link; hook arm 3 fires on kickoff-bs0.md / kickoff-b0-notes.md /
kickoff-stage1.md and stays silent on all four recognised classes.

Prior-art: prior-art-evaluations.md#265 (pre-commit-hooks symlink family,
verdict ADAPT — `destroyed-symlinks` inspects exactly our surface, git index
modes at pre-commit, but detects the INVERTED direction, a symlink degraded
into a regular file; run against 9e046c6d55 it returns clean. check-symlinks
flags broken targets, and ours resolved fine — which is why nothing surfaced
it. Neither is path-scoped, and the framework is a Python runtime beside this
repo's husky+bash pre-commit).
Prior-art: prior-art-evaluations.md#266 (ls-lint, verdict REJECT — its regex:
+ ignore: shape fits, but the gate exists for PARITY with STAGE_KICKOFF_RE, so
an .ls-lint.yml pattern would be a fourth hand-kept copy beside the TS SSOT,
the bash twin and the .gitignore globs, plus a standing Go dependency to answer
what one exported function already answers).

§1.7: forward-check applied — no-paid-llm-in-ci (both gates are git/readdir/regex, zero API calls); attention-is-not-a-mechanism.md §1 (both ship as errors, not warnings — .husky/pre-commit:161 sets fail=1); rule-enforcement-channel-selection.md §3 (detectable → gate at the earliest reachable channel); dual-implementation-discipline.md §8 (one SSOT — the bash twin's stage test at .claude/hooks/check-kickoff-traps.sh:102 now mirrors packages/core/principles/kickoff-population.ts:34 instead of an unbounded case glob, closing a latent divergence rather than adding one); build-vs-reuse consult recorded as prior-art-evaluations.md#265/#266. backward-check sweep — class = «a gitignored-with-exceptions directory whose untracked files are symlink-adopted into a shared store»; enumerated all 23 `!` negation blocks in .gitignore against the CANON-symlinking population: scripts/link-coordination.sh:75 walks ONLY .claude/orchestrator-prompts and is the sole such mechanism (scripts/check-ask-files.sh:72 merely reads $CANON/session-bus/asks), so /.ai-factory/*, /.opencode/*, /.claude/skills/aif-*/ and node_modules/ are SWEPT-CLEAN by construction and the single GAP is fixed here; sibling naming sweep over the 37-file kickoff-* population surfaced one pre-existing near-miss, grandfathered with rationale at packages/core/principles/kickoff-population.ts:62.

* docs(rules): kickoff-staging-placement gains §5.2/§5.3 + Class B → A

Cross-owner edit to a maintainer-owned artefact (.claude/rules/**), taken as
its own atomic commit with rationale per the CLAUDE.md Artifact Ownership
Contract — not as a side-effect of the mechanism commit that precedes it.

Rationale for placing them HERE rather than in a new rule: this rule already
owns the surface (paths: .claude/orchestrator-prompts/**) and the failure
class — «kickoff authoring goes wrong in a way nobody sees». Trap 1 is
literally a kickoff failing to reach staging: the commit meant to put it
there put an 84-byte $CANON path there instead. A third rule for two
anti-patterns on the same surface would be rule proliferation against
rule-enforcement-channel-selection.md §5 #always-on-bloat. §5 is renamed
Anti-patterns (plural) and given a lead sentence naming the shared shape;
the pre-existing #dispatch-before-staging becomes §5.1 verbatim.

Class B → A, stated honestly rather than silently: the letter now reflects a
shipped companion principle test (44) plus two earlier-channel gates, and the
header says in the same breath that §1 ITSELF STAYS UNGATED — merge *timing*
is not assertable at any branch-scoped channel, and §1's own §4 promotion
criterion (a further misdispatch incident) has not fired. Zero such incidents
since 2026-06-16. The Class-B compensating mechanism, the edit-time reminder
via inject-matching-rule.sh, remains live and unchanged.

Authoritative-for widens to cover §5's failure modes; NOT-authoritative-for
gains a pointer to kickoff-population.ts as the naming SSOT, so the rule
describes the classification without owning it.

§4 gains a promotion RECORD table (anti-pattern → earliest reachable channel
→ gate shipped → durable backstop) and states why both ship as errors:
attention-is-not-a-mechanism.md §1's corollary rejects a load-bearing warning
whose only consumer is «somebody reads the log».

00-rule-index.md + the AGENTS.md rule-index region are regenerated output
(npx tsx scripts/render-rule-index.mjs --write) — the Class column flips B→A.

§1.7 self-check is in the file's §6; the backward-check is an enumeration
(class → every .gitignore `!` block ∩ the CANON-symlinking population), not a
restatement of this diff, per ai-laziness-traps.md T21. It records the one
GAP found outside the diff's own files: the naming sweep surfaced a
pre-existing near-miss, defer-reflex-detection/kickoff-stage-2-and-3.md.

Prior-art: skipped — documentation-only edit to an existing rule plus
regenerated index output; the capability (classifyKickoffName + the two gates)
shipped in the preceding commit with SSOT #265/#266 cited there.

§1.7: forward-check applied — the rule's own §6 carries the full pass; complies with doc-authority-hierarchy.md §3 (Class letter first in the blockquote, parsed by scripts/render-rule-index.mjs:114), attention-is-not-a-mechanism.md §1 (the §4 record states why both gates are errors, not warnings), and rule-enforcement-channel-selection.md §3 step 5 (each anti-pattern records its chosen channel). backward-check sweep — class = «a discipline rule whose Class letter claims more enforcement than it has»; enumerated the sibling rules that ship a partial gate and state so: dual-implementation-discipline.md is Class A while §8's two judgment anti-patterns are agent-carried, and ci-tool-pinning.md §1 marks the bare root `npm install` slice explicitly NOT gated. Both name the ungated remainder in the rule body rather than in the Class letter, so this rule does the same for §1 — the header says «§1 itself stays ungated» and .claude/rules/kickoff-staging-placement.md:41 records that §1's own promotion criterion has not fired. Population re-verified: .claude/rules/00-rule-index.md:25 now renders Class A for this rule, regenerated (not hand-edited) via scripts/render-rule-index.mjs.

---------

Co-authored-by: Test <test@example.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant