Why this issue exists
/architecture:improve deepening was run end to end over this repository for the first time at
real scale: a six-subagent scan, verification of all 21 candidates it produced, an HTML report, a
durable candidate artifact, and then implementation of every candidate across 18 commits (draft PR
#4059).
The skill did its job. The scan found real duplication, and the verification phase earned its cost.
But running it at that scale surfaced six concrete frictions and four questions about scope that
are genuinely the maintainer's call, not mine. This issue records both so we are on the same page
about what this skill is for before anyone extends it.
Evidence for every claim below is one run, named where it matters.
Four decisions reserved for the maintainer
These change what the skill is, so I am not deciding them. My recommendation is stated for each.
Q1. Is there an implement-all-candidates mode, or is this one candidate per run?
Today the skill assumes one selected candidate: the interview loop, the agreed-shape field and
the handoff are all singular. This run was asked to implement all 21 in one pull request, and the
skill had nothing to say about it. Everything about running 21 candidates, ordering them by
leverage, fencing parallel workers, deciding commit granularity, was invented outside the skill and
is not written down anywhere.
My recommendation: keep the skill single-candidate, and add a short handoff section naming what
changes at bulk scale rather than absorbing the execution. The skill's own guidance is that an
interview settles decisions and never becomes the execution container, and a bulk mode would make
the corpus size the session's length. But the handoff currently goes silent exactly where a
maintainer needs it most.
Q2. Does the skill own a scan fan-out and cost budget?
Phase 1 dispatched six parallel exploration subagents with no stated cap and no cost guidance. That
is the single largest cost in the run by a wide margin, and the skill never says what a sensible
fan-out is or what it costs.
My recommendation: state a default fan-out, and a one-line cost expectation, in the skill body.
This repository already has the precedent: .claude/rules/hook-budget.md holds a fixed latency
budget for always-on hooks and says the budget never relaxes to absorb an overage. A scan budget is
the same idea applied to tokens. The number itself is yours to pick.
Q5. Does the HTML report cap or group cards above a threshold?
Twenty-one candidate cards is more than one page reads well. The report has no cap, no grouping and
no pagination, so a large repository produces a document the reader scrolls rather than scans.
My recommendation: group by recommendation badge and collapse everything below the top band by
default. The report already computes a badge per candidate and already has a Top recommendation
section, so the grouping key exists.
Q8. What fencing discipline do parallel implementation workers follow?
Downstream of Q1. When multiple workers implemented candidates concurrently in this run, two
collided on the same file before I imposed a rule that each worker owns a disjoint set of paths and
is told which paths another worker owns. That rule worked, and it is written down nowhere.
My recommendation: if Q1 keeps the skill single-candidate, capture this as one paragraph in the
handoff section rather than as machinery.
Six frictions, with the fix
These are not scope questions. Each is a defect or a gap with an evidenced cause.
1. The skill's own documented step is blocked by a sibling plugin in this marketplace
reference/topic-docs.md says the memory root's self-ignore guard applies on first write,
"verify-or-create .gitignore with *". It does not say how. The natural shell form is a redirect,
and the guardrails plugin in this same marketplace denies it:
BLOCKED: echo/printf > file write bypasses Write/Edit hooks
Reproduced in this run against printf '*\n' > .work/.gitignore. One marketplace plugin's
documented step is refused by its sibling, and the agent has to discover that by being denied.
Fix: name the mechanism. The guard is created with the Write tool, not a redirect. This is a
one-line change to the binding, and it applies to every skill that writes into the memory tier, not
only this one.
2. Nothing checks the branch is current before a long run
A deepening pass is long. This run's branch drifted eight commits behind its base while the work
was in flight, and one of those commits renamed a git config key inside a file that two candidates
had restructured. The result was a merge conflict that needed hand resolution at finalize time,
after every candidate was already committed, which is the most expensive moment to find it.
Fix: add a base-freshness check to the start of the deepening action, and recommend re-checking
before the handoff. Cheap, and it moves the conflict to the point where it costs least.
3. Phase 1.5 verification works and should say so in its output
The verification phase corrected two of 21 candidate claims that would otherwise have reached the
report as fact. That is a real hit rate on a gate people will be tempted to skip for speed.
Fix: keep the gate, and record the correction count in the candidate artifact. A reader can
then see the gate ran and what it caught, which is the argument for not skipping it next time.
4. Two artifact fields read as unfinished when the interview is skipped
Every one of the 21 candidate entries carries an empty agreed-shape and graft-record, because
the work went from verified candidate straight to implementation without the interview branch. An
empty field reads as an abandoned artifact rather than as a path deliberately not taken.
Fix: make both fields explicitly optional, with a recorded reason when the direct-to-
implementation path is used, so the artifact says which path it took.
5. Validation guidance stops before a worker needs it
Workers dispatched to implement candidates were told to validate, but the skill offers no guidance
on what a green result actually requires. In this run one worker reported a suite green that it had
run against a 41-byte stub binary which echoed its arguments and exited zero. The real binary was
installed later and the suite does pass, but the earlier green was worthless and nothing in the
process would have caught it.
Fix: one line in the scan briefing and any worker-facing guidance: a suite that skips for a
missing tool is not a pass, and a stub standing in for the tool is not the tool.
6. The skill does not say to sweep names it retires
One candidate retired seven library helpers. Every live call site was migrated correctly, but the
retired names survived in comments across eight files and in two test assertions that asserted
against a substring, so they would have passed against either spelling. Nothing failed; the repo
simply carried stale references and two weakened assertions.
Fix: add retiring a public name to the deepening checklist as a step that sweeps comments and
assertions, not only call sites. Note the exception found here: two plugin README passages record
what a past version dropped, and renaming those would falsify the record.
Acceptance criteria
reference/topic-docs.md names the Write tool as the mechanism for the memory-root guard, and no
documented step in this plugin is refused by guardrails.
- The deepening action performs a base-freshness check before the scan, and recommends one before
the handoff.
- The candidate artifact records how many claims Phase 1.5 corrected.
agreed-shape and graft-record are documented as optional, and a direct-to-implementation run
records that as the reason rather than leaving them empty.
- Worker-facing guidance states that a skipped suite is not a pass and a stub is not the tool.
- Retiring a public name is a checklist step covering comments and assertions as well as call sites.
- The four reserved questions above are answered in this issue's comments before any of them is
implemented.
Captured assumptions
- This was produced by
/planning:interview in unattended mode: nobody was available to answer
during the run. The four reserved questions are recorded as blocked rather than decided, per the
skill's auto-guard.
- The acceptance-criteria coverage prompt was skipped for the same reason, so
unwanted-behaviour and state-driven criteria coverage went unexamined.
acceptance_criteria_format resolved to free-text (untagged bullets) because no
convention-home pointer region is bound in the root instruction file, so the resolver exits 1
and the ladder degrades to the documented default.
- Every observation comes from one run over one repository. A second repository might weight these
differently, particularly the report-size question.
Out of scope
- Changing
/architecture:map-landscape or /architecture:record-decision. Neither was exercised.
- The
improvement:find boundary. The skill's existing routing note held up in this run.
- Any change to the Ousterhout vocabulary or the badge heuristics. Both worked as written.
Related
Why this issue exists
/architecture:improve deepeningwas run end to end over this repository for the first time atreal scale: a six-subagent scan, verification of all 21 candidates it produced, an HTML report, a
durable candidate artifact, and then implementation of every candidate across 18 commits (draft PR
#4059).
The skill did its job. The scan found real duplication, and the verification phase earned its cost.
But running it at that scale surfaced six concrete frictions and four questions about scope that
are genuinely the maintainer's call, not mine. This issue records both so we are on the same page
about what this skill is for before anyone extends it.
Evidence for every claim below is one run, named where it matters.
Four decisions reserved for the maintainer
These change what the skill is, so I am not deciding them. My recommendation is stated for each.
Q1. Is there an implement-all-candidates mode, or is this one candidate per run?
Today the skill assumes one selected candidate: the interview loop, the
agreed-shapefield andthe handoff are all singular. This run was asked to implement all 21 in one pull request, and the
skill had nothing to say about it. Everything about running 21 candidates, ordering them by
leverage, fencing parallel workers, deciding commit granularity, was invented outside the skill and
is not written down anywhere.
My recommendation: keep the skill single-candidate, and add a short handoff section naming what
changes at bulk scale rather than absorbing the execution. The skill's own guidance is that an
interview settles decisions and never becomes the execution container, and a bulk mode would make
the corpus size the session's length. But the handoff currently goes silent exactly where a
maintainer needs it most.
Q2. Does the skill own a scan fan-out and cost budget?
Phase 1 dispatched six parallel exploration subagents with no stated cap and no cost guidance. That
is the single largest cost in the run by a wide margin, and the skill never says what a sensible
fan-out is or what it costs.
My recommendation: state a default fan-out, and a one-line cost expectation, in the skill body.
This repository already has the precedent:
.claude/rules/hook-budget.mdholds a fixed latencybudget for always-on hooks and says the budget never relaxes to absorb an overage. A scan budget is
the same idea applied to tokens. The number itself is yours to pick.
Q5. Does the HTML report cap or group cards above a threshold?
Twenty-one candidate cards is more than one page reads well. The report has no cap, no grouping and
no pagination, so a large repository produces a document the reader scrolls rather than scans.
My recommendation: group by recommendation badge and collapse everything below the top band by
default. The report already computes a badge per candidate and already has a Top recommendation
section, so the grouping key exists.
Q8. What fencing discipline do parallel implementation workers follow?
Downstream of Q1. When multiple workers implemented candidates concurrently in this run, two
collided on the same file before I imposed a rule that each worker owns a disjoint set of paths and
is told which paths another worker owns. That rule worked, and it is written down nowhere.
My recommendation: if Q1 keeps the skill single-candidate, capture this as one paragraph in the
handoff section rather than as machinery.
Six frictions, with the fix
These are not scope questions. Each is a defect or a gap with an evidenced cause.
1. The skill's own documented step is blocked by a sibling plugin in this marketplace
reference/topic-docs.mdsays the memory root's self-ignore guard applies on first write,"verify-or-create
.gitignorewith*". It does not say how. The natural shell form is a redirect,and the
guardrailsplugin in this same marketplace denies it:Reproduced in this run against
printf '*\n' > .work/.gitignore. One marketplace plugin'sdocumented step is refused by its sibling, and the agent has to discover that by being denied.
Fix: name the mechanism. The guard is created with the Write tool, not a redirect. This is a
one-line change to the binding, and it applies to every skill that writes into the memory tier, not
only this one.
2. Nothing checks the branch is current before a long run
A deepening pass is long. This run's branch drifted eight commits behind its base while the work
was in flight, and one of those commits renamed a git config key inside a file that two candidates
had restructured. The result was a merge conflict that needed hand resolution at finalize time,
after every candidate was already committed, which is the most expensive moment to find it.
Fix: add a base-freshness check to the start of the deepening action, and recommend re-checking
before the handoff. Cheap, and it moves the conflict to the point where it costs least.
3. Phase 1.5 verification works and should say so in its output
The verification phase corrected two of 21 candidate claims that would otherwise have reached the
report as fact. That is a real hit rate on a gate people will be tempted to skip for speed.
Fix: keep the gate, and record the correction count in the candidate artifact. A reader can
then see the gate ran and what it caught, which is the argument for not skipping it next time.
4. Two artifact fields read as unfinished when the interview is skipped
Every one of the 21 candidate entries carries an empty
agreed-shapeandgraft-record, becausethe work went from verified candidate straight to implementation without the interview branch. An
empty field reads as an abandoned artifact rather than as a path deliberately not taken.
Fix: make both fields explicitly optional, with a recorded reason when the direct-to-
implementation path is used, so the artifact says which path it took.
5. Validation guidance stops before a worker needs it
Workers dispatched to implement candidates were told to validate, but the skill offers no guidance
on what a green result actually requires. In this run one worker reported a suite green that it had
run against a 41-byte stub binary which echoed its arguments and exited zero. The real binary was
installed later and the suite does pass, but the earlier green was worthless and nothing in the
process would have caught it.
Fix: one line in the scan briefing and any worker-facing guidance: a suite that skips for a
missing tool is not a pass, and a stub standing in for the tool is not the tool.
6. The skill does not say to sweep names it retires
One candidate retired seven library helpers. Every live call site was migrated correctly, but the
retired names survived in comments across eight files and in two test assertions that asserted
against a substring, so they would have passed against either spelling. Nothing failed; the repo
simply carried stale references and two weakened assertions.
Fix: add retiring a public name to the deepening checklist as a step that sweeps comments and
assertions, not only call sites. Note the exception found here: two plugin README passages record
what a past version dropped, and renaming those would falsify the record.
Acceptance criteria
reference/topic-docs.mdnames the Write tool as the mechanism for the memory-root guard, and nodocumented step in this plugin is refused by
guardrails.the handoff.
agreed-shapeandgraft-recordare documented as optional, and a direct-to-implementation runrecords that as the reason rather than leaving them empty.
implemented.
Captured assumptions
/planning:interviewin unattended mode: nobody was available to answerduring the run. The four reserved questions are recorded as blocked rather than decided, per the
skill's auto-guard.
unwanted-behaviour and state-driven criteria coverage went unexamined.
acceptance_criteria_formatresolved tofree-text(untagged bullets) because noconvention-homepointer region is bound in the root instruction file, so the resolver exits 1and the ladder degrades to the documented default.
differently, particularly the report-size question.
Out of scope
/architecture:map-landscapeor/architecture:record-decision. Neither was exercised.improvement:findboundary. The skill's existing routing note held up in this run.Related
.claude/rules/hook-budget.md, the precedent cited for Q2.docs/conventions/topic-docs/, which owns the guard referenced in friction 1.