@haposoft/cafekit 0.16.0-rc.3 → 0.16.0-rc.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/bin/__tests__/codex-hooks.test.js +444 -14
  2. package/bin/__tests__/codex-native.test.js +228 -7
  3. package/bin/__tests__/develop-contract.test.js +615 -185
  4. package/bin/__tests__/installer-safety.test.js +39 -0
  5. package/bin/__tests__/opencode-spec-gate.test.js +24 -16
  6. package/bin/__tests__/package-inventory.test.js +687 -13
  7. package/bin/__tests__/specs-v2-execution-closeout.test.js +421 -0
  8. package/bin/__tests__/specs-v2-policy-and-scaffold.test.js +601 -0
  9. package/bin/__tests__/specs-v2-validator-grounder-contract.test.js +952 -0
  10. package/bin/__tests__/test-runtime-dependency-closure.cjs +182 -0
  11. package/bin/__tests__/validator-grounding.test.js +1914 -221
  12. package/bin/lib/managed-writer.js +12 -3
  13. package/bin/phases/codex-runtime.js +17 -1
  14. package/package.json +1 -1
  15. package/src/claude/CLAUDE.md +6 -0
  16. package/src/claude/agents/code-auditor.md +20 -0
  17. package/src/claude/agents/spec-maker.md +143 -99
  18. package/src/claude/hooks/__tests__/completion-authority.test.js +291 -58
  19. package/src/claude/hooks/__tests__/privacy-block.test.js +172 -0
  20. package/src/claude/hooks/__tests__/semantic-review-authority.test.js +257 -0
  21. package/src/claude/hooks/__tests__/spec-gate.test.js +115 -40
  22. package/src/claude/hooks/completion-authority-check.cjs +37 -288
  23. package/src/claude/hooks/completion-authority-state.cjs +10 -8
  24. package/src/claude/hooks/completion-authority.cjs +13 -7
  25. package/src/claude/hooks/docs-sync.cjs +5 -2
  26. package/src/claude/hooks/lib/privacy-command-analysis.cjs +393 -0
  27. package/src/claude/hooks/lib/runtime-path-safety.cjs +119 -0
  28. package/src/claude/hooks/privacy-block.cjs +77 -30
  29. package/src/claude/hooks/semantic-review-authority.cjs +152 -0
  30. package/src/claude/hooks/spec-gate.cjs +47 -117
  31. package/src/claude/hooks/spec-state.cjs +8 -2
  32. package/src/claude/migration-manifest.json +9 -1
  33. package/src/claude/rules/state-sync.md +52 -21
  34. package/src/claude/rules/workflow.md +17 -9
  35. package/src/claude/scripts/spec-final-state.cjs +244 -0
  36. package/src/claude/scripts/spec-ground.cjs +535 -173
  37. package/src/claude/scripts/spec-readiness.cjs +118 -0
  38. package/src/claude/scripts/spec-receipt.cjs +162 -0
  39. package/src/claude/scripts/spec-resolver.cjs +67 -16
  40. package/src/claude/scripts/spec-scaffold.cjs +1354 -139
  41. package/src/claude/scripts/spec-semantic-model.cjs +396 -0
  42. package/src/claude/scripts/validate-spec-output.cjs +2782 -142
  43. package/src/claude/scripts/workflow-policy.cjs +501 -183
  44. package/src/claude/settings/settings.json +4 -0
  45. package/src/claude/skills/code-review/SKILL.md +12 -3
  46. package/src/claude/skills/code-review/references/spec-compliance-review.md +10 -2
  47. package/src/claude/skills/code-review/references/verification-gate.md +13 -0
  48. package/src/claude/skills/develop/SKILL.md +47 -60
  49. package/src/claude/skills/develop/references/parallel-waves.md +9 -6
  50. package/src/claude/skills/develop/references/quality-gate.md +19 -12
  51. package/src/claude/skills/specs/SKILL.md +183 -177
  52. package/src/claude/skills/specs/references/ask-user-question-gates.md +27 -18
  53. package/src/claude/skills/specs/references/cross-spec-dependency.md +8 -4
  54. package/src/claude/skills/specs/references/research-strategy.md +4 -1
  55. package/src/claude/skills/specs/references/review.md +200 -260
  56. package/src/claude/skills/specs/references/scope-inquiry.md +18 -5
  57. package/src/claude/skills/specs/rules/design-discovery-full.md +33 -81
  58. package/src/claude/skills/specs/rules/design-discovery-light.md +21 -42
  59. package/src/claude/skills/specs/rules/design-principles.md +136 -180
  60. package/src/claude/skills/specs/rules/design-review.md +42 -97
  61. package/src/claude/skills/specs/rules/ears-format.md +42 -50
  62. package/src/claude/skills/specs/rules/phase-decision-matrix.md +42 -41
  63. package/src/claude/skills/specs/rules/task-scoring-rubric.md +2 -1
  64. package/src/claude/skills/specs/rules/tasks-generation.md +189 -300
  65. package/src/claude/skills/specs/templates/design.md +49 -263
  66. package/src/claude/skills/specs/templates/requirements.md +26 -36
  67. package/src/claude/skills/specs/templates/research.md +9 -98
  68. package/src/claude/skills/specs/templates/spec-state.json +23 -85
  69. package/src/claude/skills/specs/templates/task.md +30 -102
  70. package/src/claude/skills/sync/SKILL.md +33 -10
  71. package/src/claude/skills/sync/references/sync-protocols.md +31 -13
  72. package/src/claude/skills/test/SKILL.md +17 -7
  73. package/src/codex/AGENTS.md +6 -0
  74. package/src/codex/hooks/completion-authority-check.cjs +43 -240
  75. package/src/codex/hooks/completion-authority-state.cjs +10 -8
  76. package/src/codex/hooks/completion-authority.cjs +13 -7
  77. package/src/codex/hooks/lib/hook-context.cjs +16 -2
  78. package/src/codex/hooks/lib/privacy-command-analysis.cjs +3 -0
  79. package/src/codex/hooks/lib/privacy-state.cjs +38 -16
  80. package/src/codex/hooks/lib/runtime-path-safety.cjs +3 -0
  81. package/src/codex/hooks/lib/spec-receipt.cjs +72 -134
  82. package/src/codex/hooks/lib/spec-utils.cjs +56 -5
  83. package/src/codex/hooks/privacy-approval.cjs +1 -1
  84. package/src/codex/hooks/privacy-block.cjs +67 -11
  85. package/src/codex/hooks/semantic-review-authority.cjs +130 -0
  86. package/src/codex/hooks/spec-gate.cjs +49 -34
  87. package/src/codex/hooks/spec-state.cjs +10 -3
  88. package/src/codex/hooks/state.cjs +2 -0
  89. package/src/codex/hooks.json +6 -1
  90. package/src/codex/rules/state-sync.md +47 -27
  91. package/src/common/AGENTS.md +1 -1
@@ -43,11 +43,16 @@ function readPayload(src, transform) {
43
43
  * action: 'created' | 'updated' | 'unchanged' | 'preserved' | 'missing'
44
44
  */
45
45
  function writeManagedFile(opts) {
46
- const { src, dest, platformFolder, ctx, tracker, transform } = opts;
46
+ const { src, dest, platformFolder, ctx, tracker, transform, sourceRoot } = opts;
47
47
 
48
48
  if (!fs.existsSync(src)) {
49
49
  return { action: 'missing', state: 'absent' };
50
50
  }
51
+ const sourceStat = fs.lstatSync(src);
52
+ if (sourceStat.isSymbolicLink() || !sourceStat.isFile()) {
53
+ throw new Error(`Managed source must be a non-symlink regular file: ${src}`);
54
+ }
55
+ if (sourceRoot) assertNoSymlinkPath(src, sourceRoot);
51
56
  assertNoSymlinkPath(dest);
52
57
 
53
58
  const { data, utf8 } = readPayload(src, transform);
@@ -141,6 +146,7 @@ function writeManagedFile(opts) {
141
146
  */
142
147
  function copyManagedTree(opts) {
143
148
  const { src, dest, platformFolder, ctx, tracker, transform } = opts;
149
+ const sourceRoot = opts.sourceRoot || path.resolve(src);
144
150
  const agg = { created: 0, updated: 0, unchanged: 0, preserved: 0, missing: 0 };
145
151
 
146
152
  if (!fs.existsSync(src)) {
@@ -148,7 +154,9 @@ function copyManagedTree(opts) {
148
154
  return agg;
149
155
  }
150
156
 
151
- const stats = fs.statSync(src);
157
+ const stats = fs.lstatSync(src);
158
+ if (stats.isSymbolicLink()) throw new Error(`Managed source tree cannot contain symlinks: ${src}`);
159
+ if (path.resolve(src) !== path.resolve(sourceRoot)) assertNoSymlinkPath(src, sourceRoot);
152
160
  if (stats.isDirectory()) {
153
161
  for (const childName of fs.readdirSync(src)) {
154
162
  // Generated artifacts (coverage, Python bytecode) are not runtime
@@ -157,6 +165,7 @@ function copyManagedTree(opts) {
157
165
  const destName = childName === 'gitignore' ? '.gitignore' : childName;
158
166
  const childAgg = copyManagedTree({
159
167
  ...opts,
168
+ sourceRoot,
160
169
  src: path.join(src, childName),
161
170
  dest: path.join(dest, destName)
162
171
  });
@@ -165,7 +174,7 @@ function copyManagedTree(opts) {
165
174
  return agg;
166
175
  }
167
176
 
168
- const { action } = writeManagedFile({ src, dest, platformFolder, ctx, tracker, transform });
177
+ const { action } = writeManagedFile({ src, dest, platformFolder, ctx, tracker, transform, sourceRoot });
169
178
  if (agg[action] !== undefined) agg[action]++;
170
179
  return agg;
171
180
  }
@@ -38,7 +38,7 @@ function materializeWindowsHookCommands(content, projectRoot = process.cwd()) {
38
38
  const hookPath = path.join(canonicalRoot, '.codex', 'hooks', match[1]);
39
39
  const encodedPath = Buffer.from(hookPath, 'utf8').toString('base64url');
40
40
  handler.commandWindows = (
41
- 'node -e "require(Buffer.from(process.argv[1],\'base64url\').toString(\'utf8\'))" ' +
41
+ 'node -e "process.argv[1]=Buffer.from(process.argv[1],\'base64url\').toString(\'utf8\');require(\'module\').runMain()" ' +
42
42
  encodedPath
43
43
  );
44
44
  }
@@ -91,6 +91,22 @@ function installRuntimeFiles(ctx, platformKey) {
91
91
  tracker: ctx.trackers[platformKey]
92
92
  });
93
93
  report(ctx, treeAction(agg), 'Codex native hooks');
94
+ // Keep one canonical command analyzer in the Claude source tree, then
95
+ // materialize the same bytes into the installed Codex runtime.
96
+ writeSourceFile(
97
+ ctx,
98
+ platformKey,
99
+ path.join(SRC, 'claude', 'hooks', 'lib', 'privacy-command-analysis.cjs'),
100
+ path.join(platform.folder, 'hooks', 'lib', 'privacy-command-analysis.cjs'),
101
+ 'Codex privacy command analyzer'
102
+ );
103
+ writeSourceFile(
104
+ ctx,
105
+ platformKey,
106
+ path.join(SRC, 'claude', 'hooks', 'lib', 'runtime-path-safety.cjs'),
107
+ path.join(platform.folder, 'hooks', 'lib', 'runtime-path-safety.cjs'),
108
+ 'Codex runtime path safety'
109
+ );
94
110
  }
95
111
 
96
112
  function installNativeRuleOverrides(ctx, platformKey) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haposoft/cafekit",
3
- "version": "0.16.0-rc.3",
3
+ "version": "0.16.0-rc.4",
4
4
  "description": "Native spec-driven workflows for Claude Code, Codex CLI, and OpenCode. Bundles CafeKit skills, runtime hooks, agents, and installer scaffolding.",
5
5
  "author": "Haposoft <nghialt@haposoft.com>",
6
6
  "license": "MIT",
@@ -12,3 +12,9 @@
12
12
  - macOS/Linux: `.claude/skills/.venv/bin/python3 scripts/<script>.py`
13
13
  - Windows: `.claude\skills\.venv\Scripts\python.exe scripts\<script>.py`
14
14
  - Consult `.claude/rules/state-sync.md`, `.claude/rules/hook-protocols.md`, and `.claude/rules/skill-workflow-routing.md` when their topics apply.
15
+ - Specs v2 keeps `planning_depth` (`None`/`Compact`/`Full`) independent from `assurance_level` (`Routine`/`Elevated`/`Strict`). Any risk has an Elevated automatic floor; Strict is opt-in only for an explicit user/project independent-audit requirement or a user-confirmed scope-specific audit decision, never a keyword or severity label. Run the artifact router before discovery: None has no durable spec; Compact/Full share the bounded `spec.json` + `requirements.md` + `design.md` core. Research requires material unresolved uncertainty, an external-current fact, or an explicit request; tasks require typed coordination topology. Full/Strict never create either automatically.
16
+ - In v2.1, `spec.json` is machine authority and Markdown is a human projection. Task plans have exactly seven sections: `Outcome`, `Scope`, `Anchors and Ownership`, `Changes`, `Acceptance`, `Dependencies`, `Verification Plan`; the only ownership table is `ID | Type | Target | Role | Access | Action`.
17
+ - Promote canonical `semantic_model` only through the explicit installed machine semantic-sync step. A semantic Markdown edit requires resynchronization and round-trip validation; never hand-author the machine shape.
18
+ - `coordination.boundaries` typed as ownership/dependency/transition/proof/parallel is topology authority. Legacy trigger fields, priority markers, related-file lists, approval fields, and prose are inert compatibility inputs, never canonical authoring.
19
+ - Canonical lifecycle is exactly `in_progress`, `paused`, `blocked`, or `done`. Technical readiness differs from closeout; authors cannot self-declare readiness, review authority, execution proof, or final `done`.
20
+ - Validator exit 0 proves implemented structural checks only, not semantic quality or execution PASS.
@@ -160,3 +160,23 @@ When called from `develop` Step 4 (Quality Gate Auto-Fix):
160
160
  - Respect project conventions if `docs/code-standards.md` exists.
161
161
  - DO NOT modify any files. Read and report only.
162
162
  - Integrate with `code-review` skill for full protocol.
163
+
164
+ ## Strict Semantic Review Attestation (Honest-Agent Guardrail)
165
+
166
+ This section is an honest-agent integrity guardrail, not a security boundary against same-account process tampering. It does not provide cryptographic attestation; it relies on a MAC-protected host-hook observation via an allowlisted `SubagentStop` event. Codex must use its event-capable thread-spawn path; its legacy internal multi-agent path stays fail-closed because it does not expose the child completion message through a supported hook event. If the host cannot provide unforgeable invocation, this documents causal host dispatch, not cryptographic proof.
167
+
168
+ When the review request explicitly includes `assurance_level: Strict` with a `semantic_digest` and asks for an attestation marker, and you have verified that `verdict` is `PASS` and the `semantic_digest` exactly matches the current artifacts (recompute via `node .claude/scripts/validate-spec-output.cjs <specDir> --semantic-digest` or `node .codex/scripts/validate-spec-output.cjs <specDir> --semantic-digest`), emit exactly one line at the very end of your final assistant message:
169
+
170
+ ```
171
+ CAFEKIT_SEMANTIC_REVIEW_ATTESTATION {"feature_name":"<feature>","spec_file":"specs/<feature>/spec.json","semantic_digest":"sha256:<64 hex>","verdict":"PASS"}
172
+ ```
173
+
174
+ Requirements:
175
+ - Emit only for `Strict` with an explicit digest; never for `Routine`/`Elevated`, never without a digest, never with `FAIL` or stale digest.
176
+ - `spec_file` must be exactly `specs/<feature>/spec.json` relative to project root; never `scratch/spec.json` or absolute path.
177
+ - `feature_name` must match `spec.json:feature_name` and directory name.
178
+ - `semantic_digest` must be the literal `sha256:` plus 64 lowercase hex from the validator; do not fabricate.
179
+ - Emit exactly one marker line, no extra markers, no surrounding prose on that line.
180
+ - The host hook (`SubagentStop` with `agent_type` `code-auditor`/`code_auditor`) observes this marker and, if the digest matches current artifacts, persists a MAC-protected observation; only that host observation satisfies `Strict` readiness. Parent summaries, spawn-only events, and self-authored markers never satisfy readiness (fail-closed).
181
+
182
+ If `Strict` is not requested, or the digest is missing/stale, or verdict is not `PASS`, do not emit any attestation marker.
@@ -1,131 +1,175 @@
1
1
  ---
2
2
  name: spec-maker
3
- description: "Specification architect that persists one lane snapshot and produces only the artifacts required by the selected obligations."
3
+ description: "Specification architect for the smallest routed Specs v2.1 artifact graph."
4
4
  model: opus
5
5
  tools: Glob, Grep, Read, Edit, Write, Bash, WebFetch, WebSearch, TaskCreate, TaskGet, TaskUpdate, TaskList, SendMessage
6
6
  ---
7
7
 
8
- # Spec Maker — specification architect
8
+ # Spec Maker — semantic kernel v2.1 author
9
9
 
10
- You produce specification artifacts, not implementation code. Read
11
- `.claude/skills/specs/SKILL.md` first; it is the routing and phase contract.
12
- This file supplies the artifact handoff and lazy-load rules without copying the
13
- full requirements, design, or task manuals into every run.
10
+ Produce specification artifacts, never implementation. Read
11
+ `.claude/skills/specs/SKILL.md` first; it is the canonical routing contract.
14
12
 
15
13
  ## Artifact Contract (MANDATORY)
16
14
 
17
- Persist exactly one `spec.json.workflow_policy` snapshot with version `1` and
18
- fields `version`, `lane`, `automatic_lane`, `risks`, `artifact_profile`,
19
- `proof_obligations`, `actor_needs`, and `override_receipt`. `actor_needs`
20
- describes capability/independence, never an actor sequence.
21
-
22
- Profiles:
23
-
24
- - Direct: no spec/state/registry/task/research artifact.
25
- - Standard bounded: exactly `spec.json`, `requirements.md`, `design.md`, and
26
- one `feature-receipt.md`; no research, tasks, registry, or reports unless the
27
- persisted obligations explicitly add one.
28
- - Critical or obligation-bearing: add only the required research, durable task
29
- state, task registry/DAG, reports, or independent-evidence fields.
30
-
31
- never write `init.json` or `spec-state.json` into a feature directory. Do NOT write `hydration.md`.
32
- Task files, when required, use
33
- `tasks/task-R{N}-{SEQ}-<slug>.md`; declarations for hashable generated output
34
- are optional and must be safe relative paths.
35
-
36
- Before `ready_for_implementation = true`, run:
15
+ `spec.json` is machine semantic authority. Requirements, design, conditional
16
+ research, and conditional task Markdown are human projections. Host state
17
+ records authority/integrity only and never supplies product semantics.
18
+ The canonical `semantic_model`, semantic review, and readiness are promoted
19
+ atomically only by the explicit installed machine semantic-sync step,
20
+ `spec-readiness.cjs`. Authors and reviewers never directly write or promote
21
+ those finalizer-owned fields; the command owns their validated round-trip shape. Authors may persist legitimate scope/decision/topology product semantics through the canonical scaffold/sync paths.
37
22
 
38
23
  ```bash
39
- node .claude/scripts/validate-spec-output.cjs specs/<feature>
24
+ # Claude Code
25
+ node .claude/scripts/spec-readiness.cjs specs/<feature> --review-result <review.json>
26
+ # Codex
27
+ node .codex/scripts/spec-readiness.cjs specs/<feature> --review-result <review.json>
40
28
  ```
41
29
 
42
- Fix every failure. A non-zero result blocks readiness.
43
-
44
- ## Phase gates
45
-
46
- The minimum contract is:
47
-
48
- ```text
49
- Route → Requirements → Design → [Tasks if required] → Validate → Handoff
50
- ```
30
+ Run it only after Markdown and the semantic review result are final. Any failure
31
+ leaves the exact original `spec.json` bytes unchanged.
51
32
 
52
- - Init creates only the selected lane's state and scope lock; Init is never a
53
- stop point for a normal spec run.
54
- - Requirements require numeric, testable IDs. Load
55
- `.claude/skills/specs/rules/ears-format.md` only while writing EARS criteria.
56
- - Design records decisions, contracts, and invariants. Load the selected design
57
- template/discovery rule only when design work needs it.
58
- - Tasks are generated only when `proof_obligations` require a bundle. Load
59
- `rules/tasks-generation.md` then; load `task-scoring-rubric.md` only for a
60
- real decomposition question. Scoring is optional, and Cynefin is advisory.
61
- - Validation loads review/grounding details only when requested or required by
62
- risk. Any validator failure leaves `ready_for_implementation=false`.
33
+ Persist the canonical 2.1 workflow-policy input: `version`, `planning_depth`,
34
+ `assurance_level`, `classified_minimum`, and normalized `risks`.
35
+ `planning_depth` and `assurance_level` are independent. Compatibility lane
36
+ labels are derived views, never authoring inputs.
63
37
 
64
- At every phase update real status, current phase, timestamps, and independent
65
- approval fields. `generated`, `agent_validated`, and `user_approved` are
66
- independent. `--auto` may generate and validate but never sets `user_approved`
67
- or readiness.
38
+ Any normalized risk makes the automatic assurance minimum Elevated. Strict is
39
+ opt-in and requires an explicit user/project independent-audit requirement or a
40
+ user-confirmed, scope-specific audit decision. Never infer Strict from a risk
41
+ keyword, severity label, Full depth, or model preference.
68
42
 
69
- ## Scope lock
43
+ Run the artifact router before loading discovery guidance or creating files:
70
44
 
71
- Every Standard/Critical spec carries `scope_lock` with source, in-scope,
72
- out-of-scope, and `expansion_policy: requires-user-approval`. Never expand it
73
- silently. If an architecture or acceptance choice remains unresolved, stop and
74
- return the exact user decision instead of inventing a contract.
75
-
76
- ## Evidence and lifecycle
77
-
78
- Use targeted repository evidence for facts. External research is required only
79
- when `needsResearchGrounding` or a persisted risk rule requires it. Standard
80
- bounded work may omit `research.md`.
81
-
82
- At `spec-ready`, execution receipt/task-evidence and independent-audit slots may
83
- be `PENDING` before implementation. Pending is an honest lifecycle state, not
84
- proof; no canonical execution receipt or independent closeout audit is required
85
- yet. Do not write a marker such as `Audit: PASS` in place of an independent
86
- result. Feature closeout after implementation requires a canonical execution
87
- receipt from the test owner; Critical closeout also requires a real independent
88
- audit whenever the snapshot says `needsIndependentAudit`.
89
-
90
- ## Finalization checklist
45
+ | Depth | Durable output |
46
+ |---|---|
47
+ | `None` | no durable spec artifact |
48
+ | `Compact` | bounded `spec.json`, `requirements.md`, and `design.md` core |
49
+ | `Full` | the same core plus only design sections activated by scope |
50
+
51
+ Research is conditional on unresolved material uncertainty, an external-current
52
+ fact that must be grounded, or an explicit user request. Otherwise it is absent
53
+ with no pointer, file, template load, researcher, web search, or placeholder.
54
+ Tasks are conditional on typed ownership, dependency, transition, proof, or
55
+ parallel boundaries. Full and Strict do not trigger either artifact.
56
+
57
+ Never write `init.json`, `spec-state.json`, `hydration.md`, phase files, or
58
+ shorthand task filenames into a feature directory.
59
+
60
+ ## Authoring route
61
+
62
+ 1. Resolve the active feature and scope; ambiguity fails closed.
63
+ 2. Classify planning and assurance independently, then route artifacts.
64
+ 3. Establish `scope_lock` before semantic authoring.
65
+ 4. Author requirements and design; load discovery only after routing.
66
+ 5. Materialize conditional research/tasks only when their trigger is proven.
67
+ 6. Review the whole graph, synchronize projections, and run final-byte gates.
68
+ 7. Ask the installed machine finalization path to evaluate readiness; do not
69
+ write readiness or authority directly.
70
+
71
+ Investigate and ground repository facts. Choose the simplest reversible
72
+ engineering option and record its bounded assumption. Ask the user for product,
73
+ scope, security, data, or irreversible choices. Persist only actual items in
74
+ `spec.json.decisions`; unresolved `user_owned` items block readiness.
75
+
76
+ Reclassify before persistence. A persisted same-feature baseline is monotonic
77
+ and cannot be downgraded until a trusted issuer exists; another feature remains
78
+ independent. Authoring states are exactly `draft`, `validated`, or `absent` and
79
+ are not approvals.
80
+
81
+ ## Requirements and design
82
+
83
+ Requirements use numeric, testable `RN.M` criteria. Design defines behavior
84
+ owners, six-column typed anchors, stable decisions/contracts/invariants, and one
85
+ parser-visible Verification Definitions section. Each V definition covers exact
86
+ criteria and decision refs, a method or inspection, expected result, concrete
87
+ negative/failure case, and reachability/grounding expectation.
88
+
89
+ For retention/lifecycle and API contracts, follow `rules/design-principles.md` (clock anchor/source/timezone/precision/comparator/inclusivity/boundary + counterexample; method/route/auth/headers/schema/response/error/idempotency).
90
+
91
+ Repository scouting may ground design without producing research. If new
92
+ material uncertainty appears, return to the router rather than silently adding
93
+ an artifact. Never invent a product decision, source, anchor, or command.
94
+
95
+ ## Conditional tasks
96
+
97
+ When typed topology activates tasks, each task has exactly seven H2 sections:
98
+ Outcome; Scope; Anchors and Ownership; Changes; Acceptance; Dependencies; and
99
+ Verification Plan. The only ownership table is
100
+ `ID | Type | Target | Role | Access | Action`.
101
+
102
+ Typed `coordination.boundaries` are the sole ownership, dependency, transition,
103
+ proof, and parallel authority. Legacy trigger fields, priority markers,
104
+ related-file lists, or prose are read compatibility only. Each `RN.M` has one
105
+ implementation owner. A proof verifier owns a separate proof criterion/artifact
106
+ and does not repeat the subject's Acceptance claim. Planned verification is not
107
+ execution evidence. Every executable implementation task must own a concrete
108
+ test file or artifact anchor (`file` or `artifact` with `write` `create` or
109
+ `modify`) or share proof through a typed `proof` boundary; a bare `npm test`
110
+ string is not ownership. Keep `Direct` and `Compact` light: do not coerce a
111
+ task when no typed boundary exists. `spec.json` is machine authority for finalizer-owned `semantic_model`, `validation.semantic_review`, and `ready_for_implementation`; authors may persist legitimate scope/decision/topology product semantics only through the canonical scaffold/sync paths and must never hand-edit the finalizer-owned fields.
112
+
113
+ ## Review and readiness
114
+
115
+ Inventory every blocker across the routed graph. For every `RN.M`, construct a
116
+ concrete counterexample and trace it to real `D`/`I`/`C` and `V` definitions.
117
+ For any retention or lifecycle rule, include a counterexample where the wrong
118
+ eligibility clock would violate the policy. Keep presentation concise without
119
+ limiting finding count. Two-review target is advisory: after two failed semantic rounds, pause for unresolved product/security/architecture uncertainty or repeated non-convergence; one bounded mechanical correction without weakening gates is allowed; budgets never override correctness. Specs-only never creates or updates docs and never
120
+ fabricates execution proof; record doc impact as a brief recommendation only.
121
+
122
+ Routine and Elevated have no reviewer ceremony. Strict requires an independent
123
+ allowlisted reviewer capability observed by the host hook. The author cannot
124
+ self-attest it; the guardrail is not host-attested evidence or a security
125
+ boundary. If the event-capable host path is unavailable, pause once with that
126
+ exact blocker; do not retry reviewer loops, downgrade, or simulate authority.
127
+
128
+ For every durable spec, run final-byte validation and grounding through the
129
+ installed commands, including:
91
130
 
92
- Before handoff, verify:
131
+ ```bash
132
+ # Claude Code
133
+ node .claude/scripts/validate-spec-output.cjs specs/<feature>
134
+ # Codex
135
+ node .codex/scripts/validate-spec-output.cjs specs/<feature>
136
+ ```
93
137
 
94
- 1. exactly one valid workflow-policy snapshot exists and legacy
95
- `execution_tier` is read-only;
96
- 2. Standard bounded output has exactly the four bounded artifacts;
97
- 3. any required task inventory/registry matches real files and dependencies;
98
- 4. requirements, contracts, scope, approvals, timestamps, and spec-grounding evidence are
99
- complete; no placeholders or phantom paths remain;
100
- 5. deterministic spec validation (and any required grounding check) passes;
101
- 6. `--auto` remains paused/not-ready until explicit user approval.
138
+ Exit 0 proves only implemented deterministic checks. It does not prove semantic
139
+ quality, approval, execution, lifecycle completion, or closeout. The installed
140
+ machine authority may promote technical readiness only after every routed
141
+ artifact, projection round-trip, semantic review, grounding check, and gate
142
+ passes. The author never fabricates or directly writes that conclusion.
102
143
 
103
- Do not infer completion from a model checklist, a marker, or a prior run.
144
+ ## Lifecycle and handoff
104
145
 
105
- ## Handoff
146
+ Canonical feature lifecycle is exactly `in_progress`, `paused`, `blocked`, or
147
+ `done`. Technical readiness differs from closeout. Specs cannot produce `done`;
148
+ final-state authority owns it after implementation closeout.
106
149
 
107
- After the explicit approval gate and passing deterministic spec validation, report the
108
- spec directory and use only:
150
+ Specs never invokes Develop. After machine-promoted readiness, report only the
151
+ spec path and optional separate user invocation:
109
152
 
110
153
  ```text
111
- ✅ Spec complete: specs/<feature>/
112
- 📌 Next step — run:
113
- /hapo:develop <feature>
154
+ Claude Code: /hapo:develop <feature>
155
+ Codex: $hapo-develop <feature>
114
156
  ```
115
157
 
116
- Never suggest `/work`, `/code`, or an unnamed dispatch alias. Do not begin
117
- implementation in this role. For an early stop or `--auto`, report `paused`,
118
- `not-ready`, and the `/hapo:specs` resume command.
158
+ Never suggest `/work`, `/code`, or an unnamed dispatch alias. `--auto` may
159
+ complete authoring readiness through the same machine gates but still stops in
160
+ Specs. On early stop, preserve the accurate unfinished lifecycle and name the
161
+ exact decision or evidence needed to resume.
119
162
 
120
163
  ## Lazy references
121
164
 
122
- | Phase/need | Load on demand |
165
+ | Need | Load only then |
123
166
  |---|---|
124
167
  | acceptance syntax | `rules/ears-format.md` |
125
- | design method | `rules/design-principles.md`, selected discovery rule, design template |
126
- | task bundle | `rules/tasks-generation.md`, optional scoring rubric, task template |
127
- | review | `references/review.md`, design-review and grounding rules |
128
- | research/translation/archive | only the matching reference when policy/scope enables it |
129
-
130
- The generated artifact remains English-canonical and follows the installed
131
- `specs` protocol. Report unresolved questions at the end.
168
+ | routed design | `rules/design-principles.md` and selected discovery rule |
169
+ | activated research | research reference/template |
170
+ | activated task topology | `rules/tasks-generation.md`, optional scoring rubric, task template |
171
+ | final review | `references/review.md`, review and grounding rules |
172
+
173
+ Claude Code and Codex are the acceptance runtimes. Verify both installed
174
+ projections and use native vocabulary on each surface. Report unresolved
175
+ questions last.