@tyroneross/build-loop 0.36.1 → 0.43.0

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 (270) hide show
  1. package/.agents/plugins/marketplace.json +2 -2
  2. package/.claude-plugin/marketplace.json +3 -3
  3. package/.claude-plugin/plugin.json +1 -1
  4. package/.codex-plugin/plugin.json +1 -1
  5. package/.cursor/rules/build-loop-surface.mdc +12 -11
  6. package/.cursor/rules/skill-index.mdc +33 -0
  7. package/AGENTS.md +213 -34
  8. package/README.md +99 -31
  9. package/agents/advisor.md +4 -4
  10. package/agents/alignment-checker.md +2 -2
  11. package/agents/architecture-scout.md +4 -4
  12. package/agents/build-orchestrator.md +38 -36
  13. package/agents/database-assessor.md +10 -4
  14. package/agents/design-contract-specialist.md +8 -8
  15. package/agents/fact-checker.md +13 -3
  16. package/agents/fix-critique.md +2 -2
  17. package/agents/independent-auditor.md +60 -7
  18. package/agents/leak-scanner.md +82 -0
  19. package/agents/overfitting-reviewer.md +2 -2
  20. package/agents/plan-critic.md +1 -1
  21. package/agents/promotion-reviewer.md +5 -5
  22. package/agents/retrospective-synthesizer.md +138 -35
  23. package/agents/scope-auditor.md +82 -11
  24. package/agents/security-reviewer.md +55 -1
  25. package/agents/self-improvement-architect.md +17 -3
  26. package/agents/transcript-pattern-miner.md +5 -5
  27. package/agents/ui-validator.md +1 -1
  28. package/bin/build-loop-debugger.js +143 -0
  29. package/bin/build-loop-install.js +1 -4
  30. package/bin/build-loop-load-probe.js +345 -0
  31. package/codex-skills/build-loop/SKILL.md +28 -6
  32. package/commands/feedback.md +37 -0
  33. package/dist/src/interactive-verifier.d.ts +1 -14
  34. package/dist/src/interactive-verifier.d.ts.map +1 -1
  35. package/dist/src/interactive-verifier.js +6 -113
  36. package/dist/src/interactive-verifier.js.map +1 -1
  37. package/dist/src/quality.d.ts +5 -0
  38. package/dist/src/quality.d.ts.map +1 -0
  39. package/dist/src/quality.js +81 -0
  40. package/dist/src/quality.js.map +1 -0
  41. package/dist/src/storage.d.ts.map +1 -1
  42. package/dist/src/storage.js +37 -3
  43. package/dist/src/storage.js.map +1 -1
  44. package/docs/agent-surface-policy.md +35 -31
  45. package/docs/memory-setup.md +19 -0
  46. package/hooks/git/pre-push +65 -4
  47. package/hooks/hooks.json +95 -38
  48. package/hooks/pre-commit +20 -1
  49. package/hooks/pre-edit-rally-point.sh +10 -3
  50. package/hooks/session-start-codex-hook-trust.sh +30 -0
  51. package/hooks/session-start-git-hooks.sh +3 -1
  52. package/hooks/session-start-rally-point.sh +52 -4
  53. package/hooks/session-start-worktree-gc.sh +47 -94
  54. package/hooks/stop-transcript-sweep.sh +173 -0
  55. package/hooks/test_closeout.sh +14 -2
  56. package/package.json +8 -7
  57. package/scripts/README.md +1 -1
  58. package/scripts/_paths.py +65 -0
  59. package/scripts/groundwork_exchange.py +1012 -0
  60. package/scripts/install_memory.py +33 -1
  61. package/scripts/lessons_index/ingest.py +13 -2
  62. package/scripts/lessons_index/query.py +36 -13
  63. package/scripts/memory_context/__init__.py +108 -14
  64. package/scripts/memory_graph/__init__.py +5 -1
  65. package/scripts/project_resolver.py +42 -36
  66. package/scripts/sync_plugin_cache.py +37 -2
  67. package/skills/agent-rally-point/SKILL.md +46 -0
  68. package/skills/api-registry-bridge/SKILL.md +1 -1
  69. package/skills/architecture/dead/SKILL.md +1 -1
  70. package/skills/architecture/impact/SKILL.md +1 -1
  71. package/skills/architecture/review/SKILL.md +1 -1
  72. package/skills/architecture/rules/SKILL.md +3 -3
  73. package/skills/architecture/scan/SKILL.md +1 -1
  74. package/skills/architecture/trace/SKILL.md +1 -1
  75. package/skills/attribution-standard/SKILL.md +6 -6
  76. package/skills/auto-decision-capture/SKILL.md +31 -2
  77. package/skills/auto-finding-capture/SKILL.md +28 -1
  78. package/skills/build-loop/SKILL.md +131 -23
  79. package/skills/build-loop/fallbacks.md +16 -21
  80. package/skills/build-loop/phases/ui-validation.md +2 -2
  81. package/skills/build-loop/references/advisor-dispatch-ladder.md +1 -1
  82. package/skills/build-loop/references/apple-native-planning.md +1 -1
  83. package/skills/build-loop/references/autonomous-and-per-commit-modes.md +11 -5
  84. package/skills/build-loop/references/autonomy-dashboard.md +115 -0
  85. package/skills/build-loop/references/capability-routing.md +24 -2
  86. package/skills/build-loop/references/coordination.md +24 -6
  87. package/skills/build-loop/references/experiment-results-template.md +15 -3
  88. package/skills/build-loop/references/leadership.md +1 -1
  89. package/skills/build-loop/references/memory.md +14 -3
  90. package/skills/build-loop/references/modular-systems-pack.md +8 -0
  91. package/skills/build-loop/references/output-style.md +86 -0
  92. package/skills/build-loop/references/phase-1-assess.md +102 -2
  93. package/skills/build-loop/references/phase-2-plan.md +9 -1
  94. package/skills/build-loop/references/phase-3-execute.md +5 -2
  95. package/skills/build-loop/references/phase-4-review.md +85 -8
  96. package/skills/build-loop/references/phase-5-iterate.md +76 -8
  97. package/skills/build-loop/references/phase-6-learn.md +10 -17
  98. package/skills/build-loop/references/privileged-request-broker.md +254 -0
  99. package/skills/build-loop/references/resource-aware-execution.md +183 -0
  100. package/skills/build-loop/references/self-recursive-dev.md +2 -2
  101. package/skills/build-loop/references/status-output-format.md +207 -0
  102. package/skills/build-loop/references/verify-dispatch.md +56 -2
  103. package/skills/building-with-deepagents/SKILL.md +1 -1
  104. package/skills/claim-scope/SKILL.md +185 -0
  105. package/skills/color-engine/SKILL.md +103 -0
  106. package/skills/color-engine/_core.py +464 -0
  107. package/skills/color-engine/color_engine.py +175 -0
  108. package/skills/cost-rca/SKILL.md +61 -0
  109. package/skills/data-plane-worktrees/SKILL.md +139 -0
  110. package/skills/data-plane-worktrees/agents/openai.yaml +4 -0
  111. package/skills/database-practice/SKILL.md +200 -0
  112. package/skills/database-practice/references/diagnostic-queries.sql +126 -0
  113. package/skills/database-practice/references/vector-and-graph-tuning.md +208 -0
  114. package/skills/database-practice/scripts/db_table_map.py +1244 -0
  115. package/skills/database-practice/scripts/test_db_table_map.py +514 -0
  116. package/skills/debug-loop/SKILL.md +36 -6
  117. package/skills/debugging-memory/SKILL.md +32 -430
  118. package/skills/debugging-memory/references/pattern-extraction.md +4 -4
  119. package/skills/debugging-memory/references/search.md +32 -120
  120. package/skills/debugging-memory/references/store.md +32 -126
  121. package/skills/debugging-memory/references/subagent-integration.md +1 -1
  122. package/skills/decision-queue/SKILL.md +251 -0
  123. package/skills/decision-queue/assets/template.html +1242 -0
  124. package/skills/decision-queue/references/example-large-queue-batching.md +164 -0
  125. package/skills/decision-queue/scripts/regen_template_constants.py +160 -0
  126. package/skills/defenseclaw-bridge/SKILL.md +2 -2
  127. package/skills/defenseclaw-bridge/references/dc-config-mapping.md +2 -9
  128. package/skills/drain-proposals/SKILL.md +53 -0
  129. package/skills/focused-loop-builder/SKILL.md +31 -0
  130. package/skills/focused-loop-builder/references/spec-format.md +27 -0
  131. package/skills/handoff/SKILL.md +169 -8
  132. package/skills/ibr-bridge/SKILL.md +4 -1
  133. package/skills/knowledge/SKILL.md +26 -14
  134. package/skills/knowledge/references/review-mode.md +2 -3
  135. package/skills/knowledge/templates/madr-minimal.md +1 -1
  136. package/skills/mcp-builder/SKILL.md +1 -1
  137. package/skills/model-bakeoff/SKILL.md +48 -10
  138. package/skills/model-tiering/SKILL.md +92 -31
  139. package/skills/native-ax-driver/SKILL.md +38 -5
  140. package/skills/native-ax-driver/scripts/native_driver.py +278 -22
  141. package/skills/native-ax-driver/scripts/test_native_driver.py +227 -0
  142. package/skills/optimize/SKILL.md +1 -1
  143. package/skills/plugin-builder/SKILL.md +48 -1
  144. package/skills/plugin-builder/references/build-loop-phase-guidance.md +3 -4
  145. package/skills/plugin-builder/references/distribution.md +13 -2
  146. package/skills/plugin-builder/references/plugin-hygiene-lessons.md +2 -2
  147. package/skills/plugin-tests/SKILL.md +2 -2
  148. package/skills/recursive-retrospective/SKILL.md +1 -1
  149. package/skills/repo-closeout/SKILL.md +17 -0
  150. package/skills/repo-closeout/agents/openai.yaml +4 -0
  151. package/skills/repo-maintenance/SKILL.md +179 -0
  152. package/skills/repo-maintenance/agents/openai.yaml +4 -0
  153. package/skills/repo-maintenance/references/pre-public-hygiene.md +134 -0
  154. package/skills/repo-maintenance/references/repository-taxonomy.md +161 -0
  155. package/skills/repo-maintenance/references/safety-protocol.md +106 -0
  156. package/skills/repo-maintenance/references/stack-profiles.md +138 -0
  157. package/skills/repo-maintenance/scripts/audit_repo_maintenance.py +1198 -0
  158. package/skills/repo-maintenance/scripts/test_audit_repo_maintenance.py +506 -0
  159. package/skills/repository-intelligence/SKILL.md +189 -0
  160. package/skills/repository-intelligence/agents/openai.yaml +4 -0
  161. package/skills/repository-intelligence/references/assessment-rubric.md +88 -0
  162. package/skills/repository-intelligence/scripts/repository_inventory.py +347 -0
  163. package/skills/research/SKILL.md +12 -2
  164. package/skills/root-cause-analysis/SKILL.md +1 -1
  165. package/skills/runtime-parity-verification/SKILL.md +36 -1
  166. package/skills/security-methodology/SKILL.md +22 -9
  167. package/skills/security-methodology/references/agentic-handoff-templates.md +220 -0
  168. package/skills/security-methodology/references/cross-source-matrix.md +1 -1
  169. package/skills/security-methodology/references/owasp-agentic-top-10.md +1 -1
  170. package/skills/security-scan/SKILL.md +55 -15
  171. package/skills/self-improve/SKILL.md +70 -50
  172. package/skills/silent-assumptions/SKILL.md +341 -0
  173. package/skills/silent-assumptions/references/elicitation-detectors.md +342 -0
  174. package/skills/spec-writing/SKILL.md +128 -24
  175. package/skills/spec-writing/scripts/check_checklist.py +114 -15
  176. package/skills/ui-design/SKILL.md +6 -4
  177. package/skills/ui-design/references/color-engine.md +132 -0
  178. package/skills/ui-design/references/design-preferences-from-owned-apps.md +8 -8
  179. package/skills/ui-design/references/ui-guidance-sources.md +1 -1
  180. package/skills/ui-design/references/universal-design-principles.alt.md +2 -2
  181. package/plugin-artifacts/codex/.codex-plugin/plugin.json +0 -41
  182. package/plugin-artifacts/codex/AGENTS.md +0 -560
  183. package/plugin-artifacts/codex/BUILD-ARTIFACT.md +0 -5
  184. package/plugin-artifacts/codex/LICENSE +0 -202
  185. package/plugin-artifacts/codex/README.md +0 -313
  186. package/plugin-artifacts/codex/assets/build-loop-plugin-icon.png +0 -0
  187. package/plugin-artifacts/codex/docs/agent-surface-policy.md +0 -63
  188. package/plugin-artifacts/codex/references/advisor-dispatch-ladder.md +0 -62
  189. package/plugin-artifacts/codex/references/agent-role-taxonomy.md +0 -135
  190. package/plugin-artifacts/codex/references/autonomous-and-per-commit-modes.md +0 -161
  191. package/plugin-artifacts/codex/references/autonomy-config.md +0 -231
  192. package/plugin-artifacts/codex/references/backlog-system.md +0 -285
  193. package/plugin-artifacts/codex/references/capability-routing.md +0 -231
  194. package/plugin-artifacts/codex/references/codex-subagents.md +0 -106
  195. package/plugin-artifacts/codex/references/coordination-file-template.md +0 -181
  196. package/plugin-artifacts/codex/references/coordination-rules.md +0 -552
  197. package/plugin-artifacts/codex/references/dogfood-reload-checkpoint.md +0 -112
  198. package/plugin-artifacts/codex/references/halt-and-ask-protocol.md +0 -102
  199. package/plugin-artifacts/codex/references/implementer-envelope-schema.md +0 -302
  200. package/plugin-artifacts/codex/references/intent-capability-pack.md +0 -257
  201. package/plugin-artifacts/codex/references/intent-exploration-prompts.md +0 -96
  202. package/plugin-artifacts/codex/references/leadership.md +0 -72
  203. package/plugin-artifacts/codex/references/memory-systems.md +0 -261
  204. package/plugin-artifacts/codex/references/memory.md +0 -313
  205. package/plugin-artifacts/codex/references/model-tier-mapping.md +0 -296
  206. package/plugin-artifacts/codex/references/modular-systems-pack.md +0 -96
  207. package/plugin-artifacts/codex/references/phase-1-assess.md +0 -249
  208. package/plugin-artifacts/codex/references/phase-2-plan.md +0 -86
  209. package/plugin-artifacts/codex/references/phase-3-execute.md +0 -49
  210. package/plugin-artifacts/codex/references/phase-4-review.md +0 -341
  211. package/plugin-artifacts/codex/references/phase-5-iterate.md +0 -72
  212. package/plugin-artifacts/codex/references/phase-6-learn.md +0 -58
  213. package/plugin-artifacts/codex/references/recent-design-structures.md +0 -274
  214. package/plugin-artifacts/codex/references/research-trigger-policy.md +0 -140
  215. package/plugin-artifacts/codex/references/runtime-smoke-triggers.md +0 -42
  216. package/plugin-artifacts/codex/references/self-review.md +0 -234
  217. package/plugin-artifacts/codex/references/single-writer-commit-protocol.md +0 -90
  218. package/plugin-artifacts/codex/references/task-capture-policy.md +0 -68
  219. package/plugin-artifacts/codex/references/ui-io-contract.md +0 -116
  220. package/plugin-artifacts/codex/references/ui-spotcheck-protocol.md +0 -65
  221. package/plugin-artifacts/codex/references/verify-dispatch.md +0 -85
  222. package/plugin-artifacts/codex/skills/build-loop/SKILL.md +0 -381
  223. package/plugin-artifacts/codex/skills/build-loop/detect-plugins.mjs +0 -82
  224. package/plugin-artifacts/codex/skills/build-loop/eval-guide.md +0 -65
  225. package/plugin-artifacts/codex/skills/build-loop/fallbacks.md +0 -549
  226. package/plugin-artifacts/codex/skills/build-loop/phases/fact-check.md +0 -42
  227. package/plugin-artifacts/codex/skills/build-loop/phases/ui-validation.md +0 -267
  228. package/plugin-artifacts/codex/skills/build-loop/references/advisor-dispatch-ladder.md +0 -62
  229. package/plugin-artifacts/codex/skills/build-loop/references/apple-native-planning.md +0 -439
  230. package/plugin-artifacts/codex/skills/build-loop/references/autonomous-and-per-commit-modes.md +0 -161
  231. package/plugin-artifacts/codex/skills/build-loop/references/capability-routing.md +0 -231
  232. package/plugin-artifacts/codex/skills/build-loop/references/codex-subagents.md +0 -106
  233. package/plugin-artifacts/codex/skills/build-loop/references/coordination.md +0 -161
  234. package/plugin-artifacts/codex/skills/build-loop/references/correction-aware-capture.md +0 -177
  235. package/plugin-artifacts/codex/skills/build-loop/references/experiment-results-template.md +0 -101
  236. package/plugin-artifacts/codex/skills/build-loop/references/independent-auditor.md +0 -72
  237. package/plugin-artifacts/codex/skills/build-loop/references/intent-capability-pack.md +0 -257
  238. package/plugin-artifacts/codex/skills/build-loop/references/intent-exploration-prompts.md +0 -96
  239. package/plugin-artifacts/codex/skills/build-loop/references/leadership.md +0 -72
  240. package/plugin-artifacts/codex/skills/build-loop/references/memory.md +0 -313
  241. package/plugin-artifacts/codex/skills/build-loop/references/modular-systems-pack.md +0 -96
  242. package/plugin-artifacts/codex/skills/build-loop/references/output-style.md +0 -222
  243. package/plugin-artifacts/codex/skills/build-loop/references/pay-it-forward-arch.md +0 -98
  244. package/plugin-artifacts/codex/skills/build-loop/references/phase-1-assess.md +0 -249
  245. package/plugin-artifacts/codex/skills/build-loop/references/phase-2-plan.md +0 -86
  246. package/plugin-artifacts/codex/skills/build-loop/references/phase-3-execute.md +0 -49
  247. package/plugin-artifacts/codex/skills/build-loop/references/phase-4-review.md +0 -341
  248. package/plugin-artifacts/codex/skills/build-loop/references/phase-5-iterate.md +0 -72
  249. package/plugin-artifacts/codex/skills/build-loop/references/phase-6-learn.md +0 -58
  250. package/plugin-artifacts/codex/skills/build-loop/references/recent-design-structures.md +0 -274
  251. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/ASSESSMENT.md +0 -85
  252. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/STANDALONE_TEST_RUN.md +0 -149
  253. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/01-simple-bugfix.md +0 -32
  254. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/02-ui-build-with-iteration.md +0 -48
  255. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/03-multi-failure-escalation.md +0 -60
  256. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/04-ui-build-ibr-absent.md +0 -51
  257. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/05-refactor-navgator-absent.md +0 -71
  258. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/06-recurring-bug-debugger-absent.md +0 -52
  259. package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/trace-comparison.md +0 -202
  260. package/plugin-artifacts/codex/skills/build-loop/references/self-recursive-dev.md +0 -77
  261. package/plugin-artifacts/codex/skills/build-loop/references/self-review.md +0 -234
  262. package/plugin-artifacts/codex/skills/build-loop/references/ui-io-contract.md +0 -116
  263. package/plugin-artifacts/codex/skills/build-loop/references/verify-dispatch.md +0 -85
  264. package/plugin-artifacts/codex/skills/build-loop/scanners/audit-design-rules.mjs +0 -476
  265. package/plugin-artifacts/codex/skills/build-loop/scanners/require-visual-evidence.mjs +0 -239
  266. package/plugin-artifacts/codex/skills/build-loop/templates/backlog-item.md +0 -35
  267. package/plugin-artifacts/codex/skills/build-loop/templates/codex-worker-prompt.md +0 -100
  268. package/plugin-artifacts/codex/skills/build-loop/templates/ui-subagent-prompt.md +0 -179
  269. package/plugin-artifacts/codex/skills/build-loop/templates/ux-fix-plan.md +0 -40
  270. package/scripts/build_codex_plugin_artifact.py +0 -321
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: build-loop:self-improve
3
- description: Use when Phase 6 Learn fires automatically after Report, the user runs `/build-loop:self-improve`, or asks to "scan recent runs" or "improve build-loop". Scans recent runs for recurring patterns, auto-drafts experimental skills/agents with A/B tracking.
3
+ description: Run mandatory Phase 6 Learn, then dispatch only the returned experimental-draft or review work orders. Use after a run closes, or when the user asks to "scan recent runs" or "improve build-loop" it looks for a recurring pattern across runs worth promoting into a skill or agent. Not for a deliberate whole-project retrospective (use `recursive-retrospective`).
4
4
  version: 0.1.0
5
5
  user-invocable: false
6
6
  ---
@@ -9,15 +9,21 @@ user-invocable: false
9
9
 
10
10
  # Build-Loop Self-Improvement (Phase 6 Learn)
11
11
 
12
- This skill runs after Review sub-step F (Report) completes, or on demand. It detects recurring patterns across recent build-loop runs, drafts experimental skills/agents to address them, and notifies the user for keep/remove decisions.
12
+ This skill runs after Review-G completes, or on demand. The deterministic runner detects recurring patterns and returns explicit work orders only when judgment is required.
13
13
 
14
14
  **Principle:** auto-draft, notify, experiment, decide based on evidence. User can always remove. A/B comparison is small and focused — one metric, short sample, clear decision rule.
15
15
 
16
16
  ## When This Skill Runs
17
17
 
18
- - Automatically at end of every build-loop run (Phase 6 Learn, after Review sub-step F (Report))
18
+ - Automatically at end of every build-loop run (Phase 6 Learn, after Review-G records the run)
19
19
  - On demand via `/build-loop:self-improve`
20
- - Skipped if `.build-loop/state.json.runs` has fewer than 3 entries not enough signal
20
+ - Accruing if `.build-loop/state.json.runs` has fewer than 3 entries; the phase still writes a receipt and mines toward the threshold
21
+
22
+ ## Entry point
23
+
24
+ Every host uses `python3 scripts/learn/__main__.py run --workdir "$PWD" --run-id <recorded-run-id> --source manual --json`. On-demand scans first create `<recorded-run-id>` with `scripts/append_run.py`; they never invent a receipt detached from `runs[]`.
25
+
26
+ The command performs deterministic work and returns `work_orders[]` only when an agent role is needed. Dispatch the named role with the order payload, then record the result through `python3 scripts/learn/__main__.py attest --workdir "$PWD" --run-id <run-id> --work-order-id <id> --status complete [--artifact <path>] [--verdict <verdict>] --json`. The receipt must reach `status: complete`.
21
27
 
22
28
  ## Flow
23
29
 
@@ -25,14 +31,13 @@ This skill runs after Review sub-step F (Report) completes, or on demand. It det
25
31
  ┌──────────────────────────────────────────────────────────────┐
26
32
  │ Phase 6 Learn: REVIEW (this skill) │
27
33
  ├──────────────────────────────────────────────────────────────┤
28
- │ 1. DETECT recurring-pattern-detector (Haiku)
29
- │ emits patterns[] JSON
34
+ │ 1. RUN deterministic Learn runner
35
+ │ emits receipt + bounded work_orders[]
30
36
  │ 2. FILTER → keep only confidence:high or count >= threshold │
31
- │ 3. DRAFT → for each kept pattern:
32
- │ self-improvement-architect (Sonnet) │
37
+ │ 3. DRAFT → returned self-improvement work orders only
33
38
  │ writes .build-loop/skills/experimental/<name>/ │
34
- │ 4. SIGNOFF → build-orchestrator (Opus 4.7) reviews each:
35
- │ approve, revise, or discard
39
+ │ 4. SIGNOFF → returned promotion-reviewer work order
40
+ records approve, revise, or discard
36
41
  │ 5. TRACK → record baseline in .build-loop/experiments/ │
37
42
  │ 6. NOTIFY → synthesize 3-5 line summary to user │
38
43
  │ (include removal command + A/B plan) │
@@ -41,48 +46,34 @@ This skill runs after Review sub-step F (Report) completes, or on demand. It det
41
46
 
42
47
  ## Steps
43
48
 
44
- ### 1. Detect recurring patterns
49
+ ### 1. Run and read the receipt
45
50
 
46
51
  ```
47
- Agent: recurring-pattern-detector (haiku)
48
- Input: read .build-loop/state.json
49
- Output: {scannedRuns, patterns: [...]}
52
+ Input: `.build-loop/learn/<run-id>.json`
53
+ Output: deterministic stage results plus bounded `work_orders[]`
50
54
  ```
51
55
 
52
- If `patterns.length === 0`, skip to step 6 (notify with "no patterns detected, N runs scanned"). End.
53
-
54
- ### 2. Filter
55
-
56
- Keep patterns matching any of:
57
- - `confidence === "high"`
58
- - `count >= 4` regardless of confidence
59
- - `type === "manual_intervention"` (user time is expensive; lower threshold)
56
+ If `work_orders[]` is empty, emit `learn_line` and close. This path uses no LLM.
60
57
 
61
- Drop the rest. Log skipped patterns in `.build-loop/experiments/skipped.jsonl` with date + reason — lets us tune thresholds later without losing signal.
58
+ ### 2. Trust the runner boundary
62
59
 
63
- ### 3. Draft experimental artifacts
60
+ The runner owns detection, filtering, deduplication, and the two-pattern cap. Do not repeat these decisions in the caller.
64
61
 
65
- For each kept pattern, dispatch:
62
+ ### 3. Dispatch returned work
66
63
 
67
- ```
68
- Agent: self-improvement-architect (sonnet)
69
- Input: the pattern object + target type (skill or agent)
70
- Output:
71
- - writes .build-loop/skills/experimental/<name>/SKILL.md (or agents/experimental/<name>.md)
72
- - returns concise 3-4 line synthesis
73
- ```
64
+ Dispatch only roles returned in `work_orders[]`, using the included payload. A `self-improvement-architect` may write `.build-loop/skills/experimental/<name>/SKILL.md` or `.build-loop/agents/experimental/<name>.md`. An `implementer` may realize a returned enforcement specification.
74
65
 
75
- The architect agent includes an A/B Experiment section in every artifact it writes.
66
+ The architect agent includes an A/B Experiment section in every artifact it writes, and runs `python3 "${CLAUDE_PLUGIN_ROOT:-.}/scripts/stamp_skill_frontmatter.py" --apply <written-path>` immediately after the write. A drafted skill is `user-invocable: false`; the harness computes `userInvocable ?? true`, so an unstamped draft would be publicly invocable the moment it lands somewhere loadable. If the architect returns without a `compliant`/`stamped` stamper status, re-run the command yourself before step 4.
76
67
 
77
- ### 4. Opus 4.7 signoff
68
+ ### 4. Attest and review
78
69
 
79
- Build-orchestrator (Opus 4.7) reads each drafted artifact and decides:
70
+ Attach the repository-relative draft with `attest`. The runner then creates a `promotion-reviewer` order. That reviewer decides:
80
71
 
81
72
  - **APPROVE** — artifact is coherent, pattern is real, A/B plan is measurable → proceed to track
82
- - **REVISE** — core idea is right, execution needs tightening → re-dispatch architect with specific feedback, max 1 revision pass
73
+ - **REVISE** — core idea is right, execution needs tightening
83
74
  - **DISCARD** — pattern is noise or artifact is unusable → delete the file, log to `.build-loop/experiments/discarded.jsonl` with reason
84
75
 
85
- Opus signoff is the quality gate. Sonnet drafts fast; Opus ensures no garbage ships into `.build-loop/skills/experimental/`.
76
+ Attach the verdict with `attest`. Pending or failed orders keep the receipt open. The host's normal model resolver selects any agent model.
86
77
 
87
78
  ### 5. Track baseline
88
79
 
@@ -102,7 +93,7 @@ After `sample_size_target` applied entries, Phase 6 Learn computes delta and emi
102
93
 
103
94
  ### 6. Notify user (concise synthesis)
104
95
 
105
- Emit exactly this format to the Review sub-step F report tail:
96
+ Emit exactly this format to the Review-G report tail:
106
97
 
107
98
  ```
108
99
  ## Phase 6 Learn: Self-Improvement Review
@@ -160,9 +151,9 @@ count in the Phase 6 summary — never auto-resolves.
160
151
 
161
152
  ## Data Contracts
162
153
 
163
- ### `.build-loop/state.json.runs[]` extensions (writer: build-orchestrator during Review sub-step F)
154
+ ### `.build-loop/state.json.runs[]` extensions (writer: build-orchestrator during Review-G)
164
155
 
165
- Review sub-step F (Report) must now append a run entry to `state.json.runs[]` before Phase 6 Learn runs. Schema:
156
+ Review-G must append a run entry to `state.json.runs[]` before Phase 6 Learn runs. Schema:
166
157
 
167
158
  ```json
168
159
  {
@@ -210,13 +201,42 @@ To opt in, create `.build-loop/config.json` with:
210
201
 
211
202
  Even with the flag on, auto-promotion requires **`sample_size_target >= 8`** and passing the promotion rules below. Below the floor, Phase 6 Learn always writes a proposal to `.build-loop/proposals/<name>.md` and blocks promotion until the user reviews. The architect agent initializes new experiments with `sample_size_target: 8` by default; only raise it when noise demands more power.
212
203
 
204
+ ### Promotion exposure statement (required in every promotion confirmation)
205
+
206
+ Promotion is the moment an experimental artifact stops being a scratch file: it becomes tracked in git AND loadable. Neither effect shows up in the artifact's own diff, so the confirmation has to say them out loud.
207
+
208
+ **Run the stamper on the DESTINATION path before asking the user** — every promotion target, no exceptions:
209
+
210
+ ```bash
211
+ python3 "${CLAUDE_PLUGIN_ROOT:-.}/scripts/stamp_skill_frontmatter.py" --apply <destination>/SKILL.md
212
+ ```
213
+
214
+ Destinations that require it: `.build-loop/skills/active/<name>/`, `~/.claude/skills/<name>/`, and `<plugin-repo>/skills/<name>/`. A non-zero exit blocks the promotion — never ask the user to confirm a move whose resulting surface is unknown.
215
+
216
+ **Then include this block verbatim in the `AskUserQuestion` body, the PushNotification body, and the `.build-loop/proposals/<name>.pending.md` marker:**
217
+
218
+ ```
219
+ Exposure after promotion
220
+ Destination: <destination path>
221
+ user-invocable: <false | true>
222
+ Directly invocable by you:
223
+ <no — reached only through build-loop routing>
224
+ <YES, as /<namespace>:<name> — because <the file's public-justification: line>>
225
+ Loaded in: <this project only | every session, every project>
226
+ Git: promotion moves the artifact out of the gitignored
227
+ `.build-loop/skills/experimental/**` tier, so it appears in
228
+ `git status` for the first time and becomes committable.
229
+ ```
230
+
231
+ `user-invocable: true` is only answerable when the file carries a `public-justification:` field — without one the stamper has already refused the promotion, so the question never reaches the user.
232
+
213
233
  ### Promotion rules
214
234
 
215
235
  When `autoPromote` is true AND `sample_size_target >= 8` AND the experiment's applied entries are all `confounded: false` (see §Confound tracking below):
216
236
 
217
237
  | Delta vs baseline | Action | Location |
218
238
  |---|---|---|
219
- | Metric improves ≥ target (non-confounded) | **Auto-promote**: `git mv .build-loop/skills/experimental/<name> .build-loop/skills/active/<name>`, update SKILL.md frontmatter `experimental: false` + `promoted_at: <ISO>`, append `{event: "promoted", ...}` to the experiment's jsonl | `.build-loop/skills/active/<name>/` |
239
+ | Metric improves ≥ target (non-confounded) | **Auto-promote**: `git mv .build-loop/skills/experimental/<name> .build-loop/skills/active/<name>`, update SKILL.md frontmatter `experimental: false` + `promoted_at: <ISO>`, run `python3 "${CLAUDE_PLUGIN_ROOT:-.}/scripts/stamp_skill_frontmatter.py" --apply .build-loop/skills/active/<name>/SKILL.md` (non-zero exit aborts the promotion and leaves the artifact in `experimental/`), emit the §Promotion exposure statement block for the user confirmation, then append `{event: "promoted", ...}` to the experiment's jsonl. The `git mv` is what makes the artifact tracked — `experimental/**` is gitignored, `active/**` is not. | `.build-loop/skills/active/<name>/` |
220
240
  | Metric improves < target (partial win) | **Extend sample** to 2N; re-evaluate after additional runs | unchanged |
221
241
  | Metric flat (±10% of baseline) | **Extend sample** to 2N; re-evaluate | unchanged |
222
242
  | Metric regresses | **Write proposal** to `.build-loop/proposals/<name>-remove.md` with evidence. Removal requires user confirmation via `AskUserQuestion` in the next Phase 6 Learn run (not immediate `rm -rf`). Avoids single-build regressions deleting useful skills. | experimental (intact) |
@@ -265,7 +285,7 @@ Auto-promote stays inside the project. Moving an experimental or active artifact
265
285
  /build-loop:promote-experiment <name>
266
286
  ```
267
287
 
268
- The command reads the experiment's track record across this and other projects (if global `~/.build-loop/experiments/` index exists), checks the artifact quality, asks the user for confirmation, and commits to the plugin repo on a feature branch for user review. See `commands/promote-experiment.md` for the full protocol.
288
+ The command reads the experiment's track record across this and other projects (if global `~/.build-loop/experiments/` index exists), checks the artifact quality, stamps the destination SKILL.md, asks the user for confirmation carrying the §Promotion exposure statement block, and commits to the plugin repo on a feature branch for user review. Full protocol: `.agents/skills/source-command-promote-experiment/SKILL.md`.
269
289
 
270
290
  ## Removal
271
291
 
@@ -282,17 +302,17 @@ The skill stops triggering immediately (no orchestrator restart needed).
282
302
 
283
303
  - Will not modify the build-loop plugin repo
284
304
  - Will not promote skills across projects without explicit user approval
285
- - Will not run if state.json has < 3 runs insufficient signal
305
+ - Will accrue when state.json has < 3 runs; deterministic Learn still runs and records its receipt
286
306
  - Will not retry pattern detection more than once per run
287
307
  - Will not write skills for patterns with confidence "low"
288
308
 
289
- ## Model Tiering (this skill)
309
+ ## Agent dispatch (this skill)
290
310
 
291
- | Step | Agent / Model |
311
+ | Step | Dispatch rule |
292
312
  |---|---|
293
- | 1. Detect | recurring-pattern-detector (haiku) |
294
- | 3. Draft | self-improvement-architect (sonnet) |
295
- | 4. Signoff | build-orchestrator (opus 4.7) |
296
- | 6. Notify | inline, no model |
313
+ | 1. Detect | Deterministic runner; no agent or LLM |
314
+ | 3. Draft | Dispatch only a returned `self-improvement-architect` work order |
315
+ | 4. Signoff | Dispatch only a returned `promotion-reviewer` work order |
316
+ | 6. Notify | Emit the receipt's deterministic `learn_line` |
297
317
 
298
- Haiku detect is the floor scanning JSON for counts. Sonnet drafts because authoring SKILL.md needs judgment about trigger phrases and structure. Opus 4.7 signs off because a bad experimental skill silently contaminates future runs; wrong spec is catastrophic.
318
+ The host resolves any returned agent role through its normal model policy. This protocol assigns no vendor-specific model.
@@ -0,0 +1,341 @@
1
+ ---
2
+ name: silent-assumptions
3
+ description: "Surface the judgement calls you already made without asking — what 'latest' meant, which viewports counted, who the audience was, whether to optimise for precision or recall — as a register the user can rule on and reverse after the fact. Not for a decision the user is BLOCKED on and work has stopped for — that is `decision-queue`. Never blocks: you make the call, apply your default, and keep working; the register is a record of work already done. Triggers: 'what did you assume', 'what calls did you make', 'silent assumptions', 'show me your assumptions', 'assumption register', or an offer at a run boundary when high-leverage calls have accumulated."
4
+ user-invocable: false
5
+ companion_scripts:
6
+ - scripts/assumption_register.py — the file-based half: new / check / build / read / promote / offer. Works identically under Claude and Codex.
7
+ companion_assets:
8
+ - skills/decision-queue/assets/template.html — the interactive page. Copy and adapt; NEVER regenerate the save/self-publish plumbing from scratch. Claude-only.
9
+ - skills/decision-queue/scripts/regen_template_constants.py — MUST run after any CSS or save-bar edit to that template. Never hand-sync HEAD_HTML / SAVE_BAR_HTML.
10
+ - references/elicitation-detectors.md — the eleven detectors, each with a real worked example, plus the 2026-09-01 adversarial-audit calibration. Read before running step 2.
11
+ namespace: .build-loop/decisions/<slug>/ (central mirror: build-loop-memory/projects/<project>/decisions/)
12
+ ---
13
+
14
+ <!-- SPDX-FileCopyrightText: 2025-2026 Tyrone Ross, Jr <46267523+tyroneross@users.noreply.github.com> | SPDX-License-Identifier: Apache-2.0 -->
15
+
16
+ # silent-assumptions — expose the calls you made without asking
17
+
18
+ Doing ordinary work you make dozens of judgement calls the user never sees.
19
+ Each is defensible. None was surfaced. The user finds out only when a result is
20
+ wrong, and then cannot tell which call caused it.
21
+
22
+ This skill finds those calls, writes them down with their evidence and their
23
+ real alternatives, and lets the user reverse any of them afterwards.
24
+
25
+ **Measured stake.** One audit session produced 20 such calls. The user reviewed
26
+ them and overrode 14. Two had already done damage before he saw them: an
27
+ unstated choice of precision over recall had sent a code fix in the wrong
28
+ direction, and an invented audience definition had contaminated an entire
29
+ five-persona research panel.
30
+
31
+ ## The one rule: this never blocks
32
+
33
+ Make the call. Apply your default. **Keep working.** The register is a record of
34
+ work already done, not a gate in front of work.
35
+
36
+ If you ever find yourself writing "wait for the user to rule on this", you have
37
+ built `decision-queue` instead. Stop.
38
+
39
+ | | `decision-queue` | `silent-assumptions` |
40
+ |---|---|---|
41
+ | The user is | blocked, waiting | unaware a call was made |
42
+ | Work has | stopped | continued |
43
+ | The page exists to | unblock work | expose and reverse a call already applied |
44
+ | Control flow | blocking by design | non-blocking by design |
45
+ | Each row already has | no answer | **your default, applied and tagged** |
46
+ | Rows are ranked by | urgency | **consequence if the call is wrong** |
47
+
48
+ Same rendering problem, opposite control flow. Both skills should exist. Do not
49
+ merge them. Do reuse `decision-queue`'s page template and save plumbing —
50
+ that part is identical and already tested.
51
+
52
+ ## Three permitted entry points, and nothing else
53
+
54
+ 1. **Invoked.** The user asks. Run the full workflow, render, hand over the path.
55
+ 2. **Accruing.** Capture rows in the background as you work. Costs the user
56
+ nothing; renders nothing.
57
+ 3. **Offering.** At a natural boundary — a phase close, a run close, the end of
58
+ a long autonomous stretch — emit ONE line offering to show the register.
59
+
60
+ An offer is one ignorable sentence. It is never `AskUserQuestion`, never a
61
+ modal, never mid-task, and never repeated for the same register. Work continues
62
+ whether or not it is taken.
63
+
64
+ ## Step 1 — Decide whether there is anything to elicit
65
+
66
+ Skip entirely for a single-file edit, a direct question, or a task where the
67
+ user specified every parameter. You need a trajectory with real judgement in it.
68
+
69
+ ## Step 2 — Run the eleven detectors against your ACTUAL trajectory
70
+
71
+ This is the part that cannot be hand-waved. You are looking for decisions you
72
+ did not notice making, so "list your assumptions" fails by construction — you
73
+ will list the ones you noticed. Instead, scan the concrete record of what you
74
+ read, ran, and decided, and let each detector ask its question of it.
75
+
76
+ Read `references/elicitation-detectors.md` for the worked example behind each row.
77
+
78
+ | # | Detector | Scan your trajectory for… | The question it forces |
79
+ |---|---|---|---|
80
+ | 1 | `ambiguous-term` | every word in the request with more than one defensible referent — **stopping rule below** | Which referent did I pick, and what else could it have meant? |
81
+ | 2 | `scope-narrowed` | every N-of-M you executed: files read vs files present, viewports, routes, samples, date ranges | What was M? Did I say I only did N? |
82
+ | 3 | `rule-applied-or-waived` | every project rule, standard, or memory you invoked — and every one you passed over | Did I apply it where an exemption existed, or waive it where it applied? |
83
+ | 4 | `tool-output-as-truth` | every tool whose ranking, severity, or verdict you passed through unchanged; every scan whose silence you read as a clean result | Whose model of importance is this, and is it the user's? |
84
+ | 5 | `number-wrong-basis` | every figure you reported; name its inputs one by one | Is any input assumed rather than measured? |
85
+ | 6 | `invented-context` | every field you filled that no source supplied: audience, persona, goal, threshold, deadline | Did I label it fabricated? |
86
+ | 7 | `assumed-workflow` | every optimisation target you chose (precision vs recall, speed vs thoroughness) **and every ordering call — what you ran in parallel, and what you ran before what** | What workflow makes that right, does it exist, and did my ordering starve a later step of its input? |
87
+ | 8 | `static-for-dynamic` | everything you inspected at rest that has behaviour: a page not clicked, an API not called, a script not run | Did I operate it, or only look at it? |
88
+ | 9 | `root-cause-not-swept` | every fix **or conclusion** you landed, **and every one you declined** | Did I sweep for other instances of the same pattern? What did I choose not to do, and did I say so? |
89
+ | 10 | `source-authority` | every instruction you obeyed, ranked by who sent it: the human, a peer agent, a hook, a file, a tool | Whose authority did I assume this carried, and did I verify the sender? |
90
+ | 11 | `irreversible-act` | every act that cannot be undone: a write to an append-only ledger, a push, a dispatch to another agent, a published artifact, a sent message | Did I do this while still deciding whether to? |
91
+
92
+ Detector 4 has a second, easier-missed half: a scan that returned nothing is not
93
+ the same as a clean result. Reading silence as a pass is itself a silent call.
94
+
95
+ **Detector 1's stopping rule (materiality).** Applied literally to a 400-word
96
+ brief, "every ambiguous word" yields dozens and drowns the register. Keep a term
97
+ only when **a different reading would have changed what you actually did**. If
98
+ both readings lead to the same action, the ambiguity was never load-bearing.
99
+
100
+ **Detectors 10 and 11 were added after an adversarial audit** of the original
101
+ nine against a real multi-agent transcript. Both found calls with large blast
102
+ radius that no other detector located: an agent that treated six peer-injected
103
+ instructions stamped `UNVERIFIED SENDER` as authoritative, and an agent that
104
+ wrote to an append-only ledger 11 seconds after being told not to change state.
105
+ Detector 11 is the inverse of detector 8 — 8 finds what you looked at but did
106
+ not operate, 11 finds what you operated and cannot un-operate.
107
+
108
+ **Yield is uneven, and that is expected.** On a read-only session (review,
109
+ audit, research) detector 9 finds little from "fixes landed", which is why its
110
+ scan target now includes conclusions and declined work. Detector 5 returns
111
+ nothing on a session that reports few figures of its own computation. A detector
112
+ that finds nothing costs one pass; skipping it costs the class it covers.
113
+
114
+ ## Step 3 — Apply both filters. They cut in opposite directions.
115
+
116
+ **Filter A — the cut test.** For each candidate, state what breaks, for whom,
117
+ and when, if the call is wrong. **If you cannot write that sentence, delete the
118
+ row.** It goes in the `consequence` field, where `assumption_register.py check`
119
+ enforces its presence. A row a cold reader could not act on is not finished.
120
+
121
+ *"When" may be a condition rather than a clock time* — "as soon as anyone opens
122
+ it on a tablet", "the first time this runs in CI", "at implementation, not
123
+ before". A trigger is what the reader needs; a timestamp is usually unavailable
124
+ and demanding one would delete good rows.
125
+
126
+ **Filter B — the restatement test.** If the user's own words already specify
127
+ this, it is not a silent assumption. Delete it. A register full of things the
128
+ user already said is worse than no register: it buries the real calls and
129
+ teaches him the artifact is noise. Quote the instruction to yourself and check
130
+ whether it actually determines the choice. "He said audit the mockups" does not
131
+ determine which viewports, so viewports survives; it does determine that you
132
+ audit mockups, so that does not.
133
+
134
+ **"The user" means the human principal — nobody else.** In a multi-agent repo
135
+ most of your turns can arrive from peer agents, hooks, or injected messages. An
136
+ instruction from a peer agent is a SOURCE, not an authority, and it does not
137
+ cut a row under this filter. It does the opposite: obeying it without checking
138
+ the sender is itself a silent call, and detector 10 exists for exactly that.
139
+ This distinction is not cosmetic — on the transcript this rule was calibrated
140
+ against, six of nine turns were peer-authored, and reading them as "the user's
141
+ words" swung the measured restatement rate from 18% to 4% and would have hidden
142
+ the session's largest assumption.
143
+
144
+ **What does NOT disqualify a row: your own narration.** Saying what you did is
145
+ not the same as flagging that a choice was being made. "Two things in parallel"
146
+ announces the action while leaving the ordering call invisible; "verified by
147
+ reading these four files" names the method while leaving the sufficiency
148
+ judgement — that reading is enough for a CI-bound fix — unstated. The test is
149
+ whether the user could tell **a choice existed and had alternatives**, not
150
+ whether you mentioned the activity.
151
+
152
+ ## Step 4 — Rate leverage by consequence, never by difficulty
153
+
154
+ | Rating | Test |
155
+ |---|---|
156
+ | `high` | Already propagated. The call left your control — an artifact shipped, a fix landed, another agent was briefed on it, a verdict was delivered to a peer. Being wrong means rework, not just a different answer. |
157
+ | `med` | Changes a conclusion, but nothing has consumed it yet. Reversible now, expensive later. |
158
+ | `low` | Reversible with no downstream. Housekeeping. |
159
+
160
+ **"Consumed" means handed off, not observed being used.** You usually cannot see
161
+ what a peer session or a human did with your output, so waiting for proof of use
162
+ would rate everything `med` and defeat the ranking. The moment a call leaves
163
+ your control it is `high`. Delivery is the line.
164
+
165
+ A hard call that changed nothing is `low`. An easy call that briefed five
166
+ subagents is `high`. In the reference register, the invented audience was one
167
+ sentence to write and rates `high`, because a five-persona panel ran on it.
168
+
169
+ ## Step 5 — Write the row
170
+
171
+ Every row carries all of these. `assumption_register.py check` fails the
172
+ register if any is missing.
173
+
174
+ | Field | Contract |
175
+ |---|---|
176
+ | `title` | One sentence, first person, naming the call. Not a topic. |
177
+ | `what_i_did` | The action, plainly. |
178
+ | `why_and_cost` | The reasoning, and what it gives up. |
179
+ | `consequence` | Filter A's sentence. What breaks, for whom, when. |
180
+ | `evidence` | A real path, selector, line number, PID, count, or command output. Never a gesture. The check warns when it contains none of these. |
181
+ | `options` | 2–4 REAL alternatives, phrased as things a person would choose between. Exactly one carries `is_default: true` and it is what you already did. |
182
+ | `leverage` | Step 4. |
183
+ | `trigger_class` | Which detector fired. Lets a later pass audit which detectors never fire. |
184
+ | `decision` | `{pick, note, reviewed_at}` — the user's, left null by you. |
185
+
186
+ **Two options is a toggle and a toggle cannot express a real choice.** The
187
+ reference register's `static` row offered audit-at-rest, operate-the-pages, and
188
+ do-both-and-compare; the user picked the third, which no binary could have
189
+ expressed. Reach for three when a compare-both or a do-both option is genuinely
190
+ available.
191
+
192
+ ## Step 6 — Write, validate, render
193
+
194
+ ```bash
195
+ BL="${CLAUDE_PLUGIN_ROOT:-.}"
196
+ DIR="$PWD/.build-loop/decisions/<YYYY-MM-DD>-<slug>"
197
+ mkdir -p "$DIR"
198
+ python3 "$BL/scripts/assumption_register.py" new --slug <slug> --title "<title>" --repo "$PWD" -o "$DIR/register.json"
199
+ # … replace the example row with your real rows …
200
+ python3 "$BL/scripts/assumption_register.py" check "$DIR/register.json" # exit 1 on any error
201
+ python3 "$BL/scripts/assumption_register.py" build "$DIR/register.json" --check # renders + lints
202
+ ```
203
+
204
+ `build` emits `spec.json`, `data.json`, `data.js`, and `dashboard.html` beside
205
+ the register. `--check` runs `dashboard_lint.py`. Tell the user the absolute
206
+ path of `dashboard.html` and stop; do not wait for a reply.
207
+
208
+ ## Step 7 — Read the rulings back
209
+
210
+ The user edits `rows[].decision.pick` (0-based index into `options`) and
211
+ `rows[].decision.note` in `register.json`, then you read them:
212
+
213
+ ```bash
214
+ python3 "$BL/scripts/assumption_register.py" read "$DIR/register.json"
215
+ ```
216
+
217
+ `read` leads with the overrides, because those are the ones that change your
218
+ behaviour. **The notes carry more instruction than the picks do** — in the
219
+ reference register the user wrote notes on 8 of 14 rulings, and several were
220
+ standing policy, not commentary on that row. Treat every note as an instruction
221
+ for future work, not as a comment on this one.
222
+
223
+ ## Step 8 — Mirror centrally, so a register raised anywhere is trackable
224
+
225
+ A register lives in the repo it describes. Tracking across repos goes through
226
+ the existing decision store — do not build a second one.
227
+
228
+ ```bash
229
+ python3 "$BL/scripts/assumption_register.py" promote "$DIR/register.json" --workdir "$PWD"
230
+ ```
231
+
232
+ This calls `scripts/write_decision/__main__.py`, the same atomic writer
233
+ `auto-decision-capture` uses (file + INDEX + events.jsonl + DB), landing rows in
234
+ `build-loop-memory/projects/<project>/decisions/`. A silent assumption is a
235
+ decision with a subtype, not a new record type: it maps onto the existing schema
236
+ as `--tags silent-assumption,...`, `--consequences` from the `consequence` field,
237
+ `--alternatives` from the options, and confidence/status that track the ruling —
238
+ `assumed`/`proposed` while unruled, `explicit`/`accepted` when the user confirms
239
+ the default, `explicit`/`rejected` when he overrides it.
240
+
241
+ Promote unruled rows too. An unreviewed high-leverage call is exactly the thing a
242
+ later session needs to find.
243
+
244
+ ## The offer threshold, and why this number
245
+
246
+ Score the register: **`high` = 2, `med` = 1, `low` = 0. Offer at 6.**
247
+
248
+ Six is three high-leverage calls, or two high plus two medium. It is set so that
249
+ three highs offer and fifteen lows do not, because a `low` is by definition
250
+ reversible with no downstream and costs nothing to leave unruled — weighting it
251
+ above zero would let volume alone trigger an offer, which is how a useful prompt
252
+ becomes ignorable noise. The audit session that motivated this skill scored 24
253
+ (8 high, 8 med, 4 low), so a real case clears the bar four times over rather
254
+ than scraping it.
255
+
256
+ **One override.** Any single row whose `consequence` names an effect that is
257
+ already shipped or cannot be undone offers immediately, at any score. Set
258
+ `"escalate": true` on that row. Consequence beats count.
259
+
260
+ ```bash
261
+ python3 "$BL/scripts/assumption_register.py" offer "$DIR/register.json" # exit 0 = offer, 1 = stay quiet
262
+ ```
263
+
264
+ Offer once per register. If he declines, do not ask again.
265
+
266
+ ## Dual host
267
+
268
+ The **file-based path is primary and works on both hosts.** `register.json` plus
269
+ the generated `dashboard.html` need no artifact host, no browser automation, and
270
+ no model tokens to refresh. Codex uses this path exclusively; the root
271
+ `AGENTS.md` section "Silent assumptions" carries the Codex instructions.
272
+
273
+ The **interactive page is a Claude-only enhancement layered on top.** Codex
274
+ cannot publish a self-saving artifact, so it must never be the primary
275
+ mechanism. When you do build it under Claude:
276
+
277
+ - Copy `skills/decision-queue/assets/template.html`. Do not hand-roll the
278
+ save/self-publish plumbing; it took a shipped user-visible bug to get right.
279
+ - Strip the leading authoring comment. Edit only the CONTENT ZONE
280
+ (`window.__META__`, `window.__ITEMS__`).
281
+ - Extend the item shape with `leverage` and with the default already marked
282
+ applied — that is the genuine structural difference from a pending decision,
283
+ because the work has already been done under it.
284
+ - If you touch that template's CSS or save bar, run
285
+ `python3 skills/decision-queue/scripts/regen_template_constants.py`. Never
286
+ hand-sync `HEAD_HTML` / `SAVE_BAR_HTML`.
287
+ - Read answers back with `Artifact({action: "read", url})` and write them into
288
+ `register.json` so both halves agree. `register.json` is the source of truth;
289
+ the page is a projection.
290
+
291
+ ## Known gaps, stated rather than worked around
292
+
293
+ `dashboard_build.py` (interface-built-right) is another session's work and is
294
+ read and invoked here, never modified. Three limits follow from that, and none
295
+ is fatal:
296
+
297
+ - **The rendered page is read-only.** Its own footer says state lives in the
298
+ record, not the page. So the file-based ruling happens by editing
299
+ `register.json`. Proposed change, not made: implement the `actions` block its
300
+ `validate()` already accepts, so a generated page can write a response file.
301
+ - **`spec.columns` is required by `validate()` but never rendered by `build()`.**
302
+ One placeholder column is supplied to satisfy it.
303
+ - **There is no slot for a per-row badge**, so leverage is prefixed into the row
304
+ label (`HIGH · …`) to stay readable without opening the row.
305
+
306
+ ## Escape hatches
307
+
308
+ | Situation | Do this |
309
+ |---|---|
310
+ | No trajectory to scan (fresh session, compacted context) | Say so, elicit only from artifacts on disk, mark the register `partial`. Do not invent rows. |
311
+ | Every candidate fails Filter A or B | Write no register. Say you found no silent calls worth ruling on. An empty register is a correct outcome. |
312
+ | `dashboard_build.py` missing | `build` still writes `register.json`, `spec.json`, `data.json`, `data.js` and exits 3 with the reason. The record survives; only the page is missing. |
313
+ | Host cannot publish artifacts | Use the file path. It is the primary mechanism, not a fallback. |
314
+ | User rules on nothing | Leave it. Do not re-offer, do not re-render, do not chase. |
315
+
316
+ ## The decision-surface family — one core, several variants
317
+
318
+ Four skills share one job: put a set of calls in front of the user and capture a
319
+ ruling. They differ only in the KIND of call, so they share a core rather than
320
+ forking one — the variant registry (`scripts/decision_surface.py`), the
321
+ interactive page and its save/self-publish plumbing
322
+ (`skills/decision-queue/assets/template.html`), and the durable writer
323
+ (`scripts/write_decision/__main__.py`). **Adding a variant is a registry entry,
324
+ never a fork of the core.**
325
+
326
+ **Choose by the question the user is actually asking, never by name.** An agent
327
+ that picks on name alone reaches for the one it already knows and rebuilds
328
+ something that exists.
329
+
330
+ | Member | Answers | Layer | Does work stop? |
331
+ |---|---|---|---|
332
+ | [`silent-assumptions`](../silent-assumptions/SKILL.md) | "What did you decide without me?" | surface | No — work continued under your default |
333
+ | [`decision-queue`](../decision-queue/SKILL.md) | "What is waiting on me?" | surface | Yes — work has stopped |
334
+ | [`auto-decision-capture`](../auto-decision-capture/SKILL.md) | "What did we already settle, and where is it written down?" | capture | No — fires passively |
335
+ | [`auto-finding-capture`](../auto-finding-capture/SKILL.md) | "What concrete issues has anyone surfaced?" | capture | No — fires passively |
336
+
337
+ `python3 scripts/decision_surface.py` prints this table (`--json` for machines).
338
+ The registry is the one place a member is declared; this table is its prose
339
+ mirror and must match it.
340
+
341
+ **You are here: `silent-assumptions`.** Reach for a sibling when the user is blocked and waiting on an answer (`decision-queue`), or when there is nothing to render and you only need the record written (`auto-decision-capture`, `auto-finding-capture`).