Skip to content

docs(openspec): retire the FCM rule, land the verification gate (verbara-meta/ADR-0023) - #111

Merged
Harol-Reina merged 1 commit into
mainfrom
docs/adr-0023-openspec-owns-the-process
Sep 20, 2026
Merged

Harol-Reina merged 1 commit into
mainfrom
docs/adr-0023-openspec-owns-the-process

Conversation

@Harol-Reina

Copy link
Copy Markdown
Contributor

Rolls verbara-meta ADR-0023The process lives in openspec/config.yaml; no third-party
process plugin
— into this repo. Same-shaped PR across the five code repos (verbara-meta/ADR-0006).

The measurement that justifies it

rules.tasks ordered:

Use Subagent-Driven Development with FCM batching where the change is non-trivial.

That line reached the agent verbatim — it is emitted inside <rules> by openspec instructions tasks — and it names a skill of a third-party plugin that is not installed in the active Claude
config
. Every session was being handed an instruction it could not carry out; an agent that cannot
comply either improvises or silently skips, and both look identical in a green PR. "FCM" made it
worse: the ecosystem never defined the acronym anywhere an agent reads (it is defined twice,
incompatibly, in tracked plans of two other repos, and zero times in the plugin the rule named).

Separately, the ecosystem's § Verification gate — run this repo's own ci.yml fast steps on the
integrated branch before committing
— reached agents only through operations.apply.guidance,
which /opsx:apply itself labels "optional additive advice… do not follow it". The strongest rule
in the ecosystem was travelling on the weakest wire. context: is the one channel the pinned 1.13.1
CLI delivers verbatim to propose and apply and archive.

Before / after

rules.tasks — one entry out, two in (4 → 5 entries):

-    - "Use Subagent-Driven Development with FCM batching where the change is non-trivial."
+    - "Order execution in three phases — A foundation (batched), B critical components (one focused subagent each), C integration (batched) — with a fresh subagent per task, where the change is non-trivial."
+    - "For a bug fix, write the failing regression test first, against the unfixed code, and paste its failure verbatim into `tasks.md`. For new capability, tests may batch into Phase C."

The second rule is not imported discipline — it settles an inconsistency that is ours: across the
ecosystem's open changes, four are tests-first and three are tests-last, with no rule saying which is
right.

context: — the gate appended as a third bullet under the existing Constraints: list:

   - Keep it lightweight and static-first; Worker routes/D1 only where dynamic behavior is required.
+  - Before any commit or push, run the fast, deterministic, non-service steps of this repo's own
+    .github/workflows/ci.yml on the integrated branch — build plus the touched tests plus
+    `openspec validate` is a strict subset, because a tree-scanning guard is tripped by a change
+    anywhere.

Repo-specific shaping, deliberate: unlike the other four repos this context: has no
Hard constraints (non-negotiable): heading — it is a plain Constraints: bullet list. The gate
joins that list in its own style rather than importing a heading that would read as noise here. The
rules.tasks replacement keeps this repo's "where the change is non-trivial" flavour instead of
the other repos' "never inline in the main session".

Ratchet conditions satisfied

/xr:doctor check 21 (no-process-plugin) WARNs unless both hold. Measured on this branch:

Condition Result
rules.tasks contains no FCM 0 occurrences
rules.tasks contains no Subagent-Driven Development 0 occurrences
context: contains ci.yml yes
context: contains integrated branch yes

grep -n 'FCM\|Subagent-Driven Development' openspec/config.yaml → rc=1 (no match). "A fresh
subagent per task" carries the meaning without the banned phrase.

Verification

YAML parseopenspec validate does not read config.yaml, so a broken YAML would merge
green. Parsed explicitly:

$ python3 -c "import yaml;d=yaml.safe_load(open('openspec/config.yaml'));print(list(d.keys()))"
['schema', 'context', 'rules', 'operations']

The rules actually reach the agent — this repo has no open change, so a throwaway
(openspec new change zz-verify-rules --json) was used and then removed (git status clean):

$ openspec instructions tasks --change zz-verify-rules
<project_context>
...
25:  .github/workflows/ci.yml on the integrated branch — build plus the touched tests plus
<rules>
37:- Order execution in three phases — A foundation (batched), B critical components (one focused subagent each), C integration (batched) — with a fresh subagent per task, where the change is non-trivial.
38:- For a bug fix, write the failing regression test first, against the unfixed code, and paste its failure verbatim into `tasks.md`. For new capability, tests may batch into Phase C.

Zero hits for FCM / Subagent-Driven Development in that output. instructions apply carries the
gate too (line 25) — which is the whole point of moving it from guidance to context.

This repo's own ci.yml fast steps, on the integrated branch, all green:

Step Result
npm run check 85 files — 0 errors, 0 warnings, 0 hints
npm run lint rc=0
npm run test:i18n i18n parity OK across 3 locales (476 keys each)
npm run validate:digests OK — 2 current, 54 deprecated, 56 unique refs (file untouched)
npm test 6 files, 92 passed
npm run build 36 pages in 1.26s
npm run validate:html 0 errors (8 pre-existing long-title warnings)
bash scripts/tests/test_classify_docs_only.sh passed=37 failed=0
python3 -m unittest discover scripts/tests Ran 32 tests — OK
openspec validate --all --strict --no-interactive rc=0 — "No items found to validate" (no specs yet here; normal)
scripts/ci/classify-docs-only.sh on this commit docs_only=truecoverage/e2e/lighthouse skip as designed

Not touched, on purpose

  • data/authorized-digests.json — security-critical and release-owned by /xr:release.
  • Historical prose: docs/plans/, docs/specs/, docs/decisions/, CHANGELOG.md. The six
    docs/plans/completed/ files that cite superpowers:subagent-driven-development are
    period-correct records — evidence, not instructions. No live tracked file cites the
    superpowers: namespace, so check 21 already passes on that clause here.
  • .gitignoredocs/superpowers/, .superpowers/ and .worktrees/ are all already covered;
    this repo had no gap to close.
  • CHANGELOG.md [Unreleased] — n/a, this PR is typed docs.

🤖 Generated with Claude Code

…ara-meta/ADR-0023)

`rules.tasks` ordered "Use Subagent-Driven Development with FCM batching where the
change is non-trivial." That reached the agent verbatim in `openspec instructions
tasks` and named a skill of a third-party plugin that is NOT installed in the active
Claude config — an instruction no session could carry out. "FCM" was never defined
anywhere an agent reads (twice, incompatibly, in tracked plans of other repos).

Replaced by two rules of our own, naming no external skill: the three-phase ordering
(A foundation batched -> B critical components, one focused subagent each -> C
integration batched, a fresh subagent per task, "where the change is non-trivial" —
this repo's variant), and the test-ordering rule that settles a real inconsistency of
our own (failing regression test first for a bug fix; tests may batch into Phase C for
new capability).

Separately, the ecosystem's verification gate travelled on `operations.apply.guidance`,
which `/opsx:apply` itself calls "optional additive advice... do not follow it". It
moves to `context:`, the one channel 1.13.1 delivers verbatim to propose, apply AND
archive. Appended as a bullet under the existing `Constraints:` list — this repo has no
`Hard constraints` block, and inventing one just to match the other four would have been
noise.

Ratchet (/xr:doctor check 21 `no-process-plugin`): `rules.tasks` now contains 0
occurrences of "FCM" and 0 of "Subagent-Driven Development"; `context:` contains both
"ci.yml" and "integrated branch".

Verified on this branch:
- YAML parse: keys ['schema', 'context', 'rules', 'operations'], rules.tasks 4 -> 5 entries.
  `openspec validate` never reads config.yaml, so a broken YAML would have merged green.
- `openspec instructions tasks --change zz-verify-rules` (throwaway, removed; git clean):
  both new rules at <rules> lines 37-38, the gate inside <project_context>; also confirmed
  in `instructions apply`. 0 hits for FCM / Subagent-Driven Development.
- ci.yml fast steps, all green: npm run check (0 errors, 85 files), npm run lint,
  npm run test:i18n (476 keys x 3 locales), npm run validate:digests (56 refs —
  authorized-digests.json untouched), npm test (92 passed), npm run build (36 pages),
  npm run validate:html (0 errors), scripts/tests/test_classify_docs_only.sh (37 passed),
  python3 -m unittest discover scripts/tests (32 passed),
  openspec validate --all --strict --no-interactive (rc=0, "No items found" — no specs yet).

No .gitignore change needed (docs/superpowers/, .superpowers/, .worktrees/ already
covered) and no live tracked file cites the `superpowers:` namespace outside historical
prose, which ADR-0023 protects.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 20, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
verbara-website b60ef12 Commit Preview URL

Branch Preview URL
Sep 20 2026, 10:16 PM

@Harol-Reina
Harol-Reina added this pull request to the merge queue Sep 20, 2026
Merged via the queue into main with commit 200aa7a Sep 20, 2026
9 checks passed
@Harol-Reina
Harol-Reina deleted the docs/adr-0023-openspec-owns-the-process branch September 20, 2026 22:42
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