research(meta-orchestrator): SKILL.md §5 row 3 vs worker-dispatch anti-pattern drift - #265
research(meta-orchestrator): SKILL.md §5 row 3 vs worker-dispatch anti-pattern drift#265artyhoo wants to merge 1 commit into
Conversation
…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).
|
Superseded by Why superseded: this R-phase identified SKILL.md §5 row 3 vs anti-pattern §348 drift and recommended Candidate C ( 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. |
…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>
Summary
#worker-dispatch-via-subagent(line 348) contradict on parallel R-phase Worker dispatch. The conflict surfaces as recurring maintainer friction — manualgit worktree add+ N fresh-tab pastes per parallel R-phase umbrella (4× for aif-handoff bridge alone).isolation:"worktree"as the explicit gate for whether Agent-tool dispatch satisfies the channel-matters discipline. Decisive evidence comes from §3.2 Superpowers upstream norm: the project's own adopted SSOT chore(skills+agents): cleanup batch from 2026-05-16 skills+agents audit #64 + feat(skill-drift): multi-channel drift detection from D-AuditC-5 #65 explicitly dispatch write-Workers via in-session Task tool AND mandate native worktree primitive (labels manualgit worktree addas «the feat: audit fixes Phase 1+2+3 (R2/R11 drift, manifest SSOT, depcruise integration) #1 mistake» and «fighting the harness»). Anti-pattern §348 instructs the OPPOSITE on both axes.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
Test plan
This is an R-phase research patch — no code, no tests. Pre-push hooks pass:
principle 10research-patch scope annotation:<!-- scope:meta-orchestrator-SKILL.md-§5-row-3-vs-worker-dispatch-via-subagent -->§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 viagit log -S+git show(commits 07ecfd6 and 09c245a, patch §2.1-§2.2, file:linedocs/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 + CCisolation:"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-worktreesREFERENCE — Candidate C preserves this adoption; Candidate B contradicts it). prior-art-evaluations.md#64 (subagent-driven-developmentADOPT VOCABULARY — Candidate C aligns with the inline Task-tool dispatch pattern this row references).