You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(primitives): renumber so Wait=P9 — restore skill-name↔primitive-number alignment (#23)
The productive-wait primitive returns to P9, matching the `broomva/p9`
skill repo name. Skill Freshness moves to P7, Branch+Worktree Janitor
moves to P8. This closes the Name (Pn) recall-key failure mode the
naming rule (PR #21) was designed to prevent: under the interim
P7=Wait / P8=Freshness / P9=Janitor numbering, the `broomva/p9` skill
name pointed at primitive P9 (Janitor), making `feedback_p9_reflexive.md`
ambiguous — was it about the skill (Wait) or the primitive number
(Janitor)? The 2026-05-16 renumber restores Wait = P9 = `broomva/p9`
everywhere.
Stacked on PR #21 (`feat/primitive-naming-reflex`) so this PR carries
both the naming rule and the alignment fix it makes possible.
Changes:
- SKILL.md: description-block prose + primitive table P7/P8/P9 swap +
Short-name index in the naming-convention section. Added prose
explaining why Wait sits at P9 (skill repo name commitment).
- references/primitives.md: TOC + section bodies P7/P8/P9 swap +
Short-name index. Section bodies carry legacy-path callouts pointing
at the OPPOSITE direction now (~/.config/broomva/p7/ canonical, p8/
legacy for freshness; p8-janitor/ canonical, p9-janitor/ legacy for
janitor). The §P9 Skill name paragraph now explains the renumber
rationale + the "numeric soup" failure mode it closes.
- assets/templates/settings.json.snippet: skill-freshness-hook.sh's
`_bstack_primitive` annotation flipped P8 → P7.
- assets/templates/policy.yaml.template: two comment headers updated
to mark the ci_watch + auto_merge blocks as P9 primitives.
- assets/templates/{CLAUDE,AGENTS}.md.template: no changes — these were
already in the target ordering (the templates have been ahead of the
workspace this whole time, which is what made the renumber possible
in one PR).
- scripts/doctor.sh:
- Section 1-8 comment block updated for new numbering.
- P_NAMES array swap (P7=Skill Freshness, P8=Janitor, P9=Wait).
- REFLEXIVE_PRIMS now includes P9 (Wait, reasoning-enforced) and
excludes P7 (Freshness, hook-enforced).
- HOOK_LABELS skill-freshness-hook.sh label flipped P8 → P7.
- SCRIPT_PATHS reordered so SCRIPT_LABELS=(P1 P2 P6 P7 P8 P9 P12)
matches the new path-to-primitive mapping.
- NEW Section 9 — Naming convention propagation. Lints CLAUDE.md +
AGENTS.md for (a) presence of the Name (Pn) naming rule in prose
and (b) a Short-name index with exactly 20 entries. Closes the
silent-drift failure mode where governance edits could leave the
index mismatched with the primitive count.
- tests/template_lockstep.test.sh: updated explanatory comment to
reflect that templates and workspace canonical now agree. Kept in
WARN mode for one release cycle to ease in-place upgrades from
downstream workspaces still on legacy ordering.
- VERSION: 0.1.0 → 0.2.0.
- CHANGELOG.md: 0.2.0 entry covering the renumber rationale, the
migration path (legacy env vars + config dirs still honored), the
naming-rule propagation (PR #21 carry-forward), and the doctor
Section 9 extension.
Workspace PR-A (companion to this PR) will follow shortly with the
runtime changes (CLAUDE.md + AGENTS.md + scripts/skill-freshness-hook.sh +
scripts/branch-janitor.sh) so the workspace mechanisms match these
declarative bstack changes. Until PR-A lands, doctor against the
workspace reports a single P9-missing-reflexive-rule gap — that's the
expected coordination signal.
Validation:
- tests/template_lockstep.test.sh: 15/15 (canonical count = 20)
- scripts/doctor.sh: 78/79 — only gap is workspace AGENTS.md P9
missing reflexive rule, which PR-A fixes. Section 9 Name (Pn) lint
passes for both CLAUDE.md + AGENTS.md.
Co-authored-by: Carlos D. Escobar-Valbuena <devteam@getstimulus.ai>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|**P7**|CI Watcher + Productive Wait (`broomva/p9` skill — historical name) | sleep-on-wait dead time (CI, deploys, builds — PR CI is the reference impl)|
|**P9**|CI Watcher + Productive Wait (`broomva/p9` skill — name matches number) | sleep-on-wait dead time (CI, deploys, builds — PR CI is the reference impl)|
97
97
|**P10**| Worktree Hygiene Discipline | dirty-tree drift across the PR lifecycle |
98
98
|**P11**| Empirical Feedback Loop | shipping code that compiles but doesn't work |
99
99
|**P12**| Persistent Loop Discipline (`broomva/persist` skill) | long-horizon work decaying as the context window rots |
@@ -112,9 +112,9 @@ Full reference: see [references/primitives.md](references/primitives.md).
112
112
113
113
Each primitive carries a **short name** for use in agent prose. When referencing a primitive in responses, PR bodies, commit messages, code comments, knowledge-graph entries, or any human-readable surface, use the **`Name (Pn)`** form — *"applying Snapshot (P15)"*, *"via Dep-Chain (P14)"*, *"running Bookkeeping (P6)"* — not bare `P15` / `P14` / `P6`. The number is the canonical identifier (stable across renames); the name is the human-readable handle. First mention in a response uses the full form; subsequent mentions in the same response may drop to bare `Name` ("Snapshot showed clean state") but never to bare `Pn`. Anchors, section IDs (`#p15-state-snapshot-before-action`), and primitive-count headers ("Twenty irreducible primitives") stay numeric — URL stability and arithmetic respectively. Failure mode: bare `Pn` makes responses read as numeric soup; cross-session readers can't decode the reference without a lookup. The Short-name index below is the recall key.
**Canonical statement** lives in workspace `CLAUDE.md` §Bstack Core Automation Primitives and workspace `AGENTS.md` near line 93. This SKILL.md restates the rule so it's visible at the entry point where `/bstack` loads.
117
+
**Canonical statement** lives in workspace `CLAUDE.md` §Bstack Core Automation Primitives and workspace `AGENTS.md` near line 93. This SKILL.md restates the rule so it's visible at the entry point where `/bstack` loads.**Note**: Wait sits at P9 to match the `broomva/p9` skill repo name — the primitive number and the skill name are intentionally aligned. Skill repos that don't carry a number (e.g., `broomva/bookkeeping` = P6, `broomva/persist` = P12) take their name from the function, not the number; carrying a numeric skill name is a commitment to keep that number stable.
118
118
119
119
**Canonical operating mode**: `broomva/autonomous` — when the user says "go" / "proceed" / "be autonomous" / "automerge" / any bare execution directive, `/autonomous` fires the 20-reflex pipeline that exercises every primitive above in the right sequence. Substrate without mode is dormant; mode without substrate is wishful. Compounded, they produce a self-operating workspace.
0 commit comments