@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.
- package/.agents/plugins/marketplace.json +2 -2
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor/rules/build-loop-surface.mdc +12 -11
- package/.cursor/rules/skill-index.mdc +33 -0
- package/AGENTS.md +213 -34
- package/README.md +99 -31
- package/agents/advisor.md +4 -4
- package/agents/alignment-checker.md +2 -2
- package/agents/architecture-scout.md +4 -4
- package/agents/build-orchestrator.md +38 -36
- package/agents/database-assessor.md +10 -4
- package/agents/design-contract-specialist.md +8 -8
- package/agents/fact-checker.md +13 -3
- package/agents/fix-critique.md +2 -2
- package/agents/independent-auditor.md +60 -7
- package/agents/leak-scanner.md +82 -0
- package/agents/overfitting-reviewer.md +2 -2
- package/agents/plan-critic.md +1 -1
- package/agents/promotion-reviewer.md +5 -5
- package/agents/retrospective-synthesizer.md +138 -35
- package/agents/scope-auditor.md +82 -11
- package/agents/security-reviewer.md +55 -1
- package/agents/self-improvement-architect.md +17 -3
- package/agents/transcript-pattern-miner.md +5 -5
- package/agents/ui-validator.md +1 -1
- package/bin/build-loop-debugger.js +143 -0
- package/bin/build-loop-install.js +1 -4
- package/bin/build-loop-load-probe.js +345 -0
- package/codex-skills/build-loop/SKILL.md +28 -6
- package/commands/feedback.md +37 -0
- package/dist/src/interactive-verifier.d.ts +1 -14
- package/dist/src/interactive-verifier.d.ts.map +1 -1
- package/dist/src/interactive-verifier.js +6 -113
- package/dist/src/interactive-verifier.js.map +1 -1
- package/dist/src/quality.d.ts +5 -0
- package/dist/src/quality.d.ts.map +1 -0
- package/dist/src/quality.js +81 -0
- package/dist/src/quality.js.map +1 -0
- package/dist/src/storage.d.ts.map +1 -1
- package/dist/src/storage.js +37 -3
- package/dist/src/storage.js.map +1 -1
- package/docs/agent-surface-policy.md +35 -31
- package/docs/memory-setup.md +19 -0
- package/hooks/git/pre-push +65 -4
- package/hooks/hooks.json +95 -38
- package/hooks/pre-commit +20 -1
- package/hooks/pre-edit-rally-point.sh +10 -3
- package/hooks/session-start-codex-hook-trust.sh +30 -0
- package/hooks/session-start-git-hooks.sh +3 -1
- package/hooks/session-start-rally-point.sh +52 -4
- package/hooks/session-start-worktree-gc.sh +47 -94
- package/hooks/stop-transcript-sweep.sh +173 -0
- package/hooks/test_closeout.sh +14 -2
- package/package.json +8 -7
- package/scripts/README.md +1 -1
- package/scripts/_paths.py +65 -0
- package/scripts/groundwork_exchange.py +1012 -0
- package/scripts/install_memory.py +33 -1
- package/scripts/lessons_index/ingest.py +13 -2
- package/scripts/lessons_index/query.py +36 -13
- package/scripts/memory_context/__init__.py +108 -14
- package/scripts/memory_graph/__init__.py +5 -1
- package/scripts/project_resolver.py +42 -36
- package/scripts/sync_plugin_cache.py +37 -2
- package/skills/agent-rally-point/SKILL.md +46 -0
- package/skills/api-registry-bridge/SKILL.md +1 -1
- package/skills/architecture/dead/SKILL.md +1 -1
- package/skills/architecture/impact/SKILL.md +1 -1
- package/skills/architecture/review/SKILL.md +1 -1
- package/skills/architecture/rules/SKILL.md +3 -3
- package/skills/architecture/scan/SKILL.md +1 -1
- package/skills/architecture/trace/SKILL.md +1 -1
- package/skills/attribution-standard/SKILL.md +6 -6
- package/skills/auto-decision-capture/SKILL.md +31 -2
- package/skills/auto-finding-capture/SKILL.md +28 -1
- package/skills/build-loop/SKILL.md +131 -23
- package/skills/build-loop/fallbacks.md +16 -21
- package/skills/build-loop/phases/ui-validation.md +2 -2
- package/skills/build-loop/references/advisor-dispatch-ladder.md +1 -1
- package/skills/build-loop/references/apple-native-planning.md +1 -1
- package/skills/build-loop/references/autonomous-and-per-commit-modes.md +11 -5
- package/skills/build-loop/references/autonomy-dashboard.md +115 -0
- package/skills/build-loop/references/capability-routing.md +24 -2
- package/skills/build-loop/references/coordination.md +24 -6
- package/skills/build-loop/references/experiment-results-template.md +15 -3
- package/skills/build-loop/references/leadership.md +1 -1
- package/skills/build-loop/references/memory.md +14 -3
- package/skills/build-loop/references/modular-systems-pack.md +8 -0
- package/skills/build-loop/references/output-style.md +86 -0
- package/skills/build-loop/references/phase-1-assess.md +102 -2
- package/skills/build-loop/references/phase-2-plan.md +9 -1
- package/skills/build-loop/references/phase-3-execute.md +5 -2
- package/skills/build-loop/references/phase-4-review.md +85 -8
- package/skills/build-loop/references/phase-5-iterate.md +76 -8
- package/skills/build-loop/references/phase-6-learn.md +10 -17
- package/skills/build-loop/references/privileged-request-broker.md +254 -0
- package/skills/build-loop/references/resource-aware-execution.md +183 -0
- package/skills/build-loop/references/self-recursive-dev.md +2 -2
- package/skills/build-loop/references/status-output-format.md +207 -0
- package/skills/build-loop/references/verify-dispatch.md +56 -2
- package/skills/building-with-deepagents/SKILL.md +1 -1
- package/skills/claim-scope/SKILL.md +185 -0
- package/skills/color-engine/SKILL.md +103 -0
- package/skills/color-engine/_core.py +464 -0
- package/skills/color-engine/color_engine.py +175 -0
- package/skills/cost-rca/SKILL.md +61 -0
- package/skills/data-plane-worktrees/SKILL.md +139 -0
- package/skills/data-plane-worktrees/agents/openai.yaml +4 -0
- package/skills/database-practice/SKILL.md +200 -0
- package/skills/database-practice/references/diagnostic-queries.sql +126 -0
- package/skills/database-practice/references/vector-and-graph-tuning.md +208 -0
- package/skills/database-practice/scripts/db_table_map.py +1244 -0
- package/skills/database-practice/scripts/test_db_table_map.py +514 -0
- package/skills/debug-loop/SKILL.md +36 -6
- package/skills/debugging-memory/SKILL.md +32 -430
- package/skills/debugging-memory/references/pattern-extraction.md +4 -4
- package/skills/debugging-memory/references/search.md +32 -120
- package/skills/debugging-memory/references/store.md +32 -126
- package/skills/debugging-memory/references/subagent-integration.md +1 -1
- package/skills/decision-queue/SKILL.md +251 -0
- package/skills/decision-queue/assets/template.html +1242 -0
- package/skills/decision-queue/references/example-large-queue-batching.md +164 -0
- package/skills/decision-queue/scripts/regen_template_constants.py +160 -0
- package/skills/defenseclaw-bridge/SKILL.md +2 -2
- package/skills/defenseclaw-bridge/references/dc-config-mapping.md +2 -9
- package/skills/drain-proposals/SKILL.md +53 -0
- package/skills/focused-loop-builder/SKILL.md +31 -0
- package/skills/focused-loop-builder/references/spec-format.md +27 -0
- package/skills/handoff/SKILL.md +169 -8
- package/skills/ibr-bridge/SKILL.md +4 -1
- package/skills/knowledge/SKILL.md +26 -14
- package/skills/knowledge/references/review-mode.md +2 -3
- package/skills/knowledge/templates/madr-minimal.md +1 -1
- package/skills/mcp-builder/SKILL.md +1 -1
- package/skills/model-bakeoff/SKILL.md +48 -10
- package/skills/model-tiering/SKILL.md +92 -31
- package/skills/native-ax-driver/SKILL.md +38 -5
- package/skills/native-ax-driver/scripts/native_driver.py +278 -22
- package/skills/native-ax-driver/scripts/test_native_driver.py +227 -0
- package/skills/optimize/SKILL.md +1 -1
- package/skills/plugin-builder/SKILL.md +48 -1
- package/skills/plugin-builder/references/build-loop-phase-guidance.md +3 -4
- package/skills/plugin-builder/references/distribution.md +13 -2
- package/skills/plugin-builder/references/plugin-hygiene-lessons.md +2 -2
- package/skills/plugin-tests/SKILL.md +2 -2
- package/skills/recursive-retrospective/SKILL.md +1 -1
- package/skills/repo-closeout/SKILL.md +17 -0
- package/skills/repo-closeout/agents/openai.yaml +4 -0
- package/skills/repo-maintenance/SKILL.md +179 -0
- package/skills/repo-maintenance/agents/openai.yaml +4 -0
- package/skills/repo-maintenance/references/pre-public-hygiene.md +134 -0
- package/skills/repo-maintenance/references/repository-taxonomy.md +161 -0
- package/skills/repo-maintenance/references/safety-protocol.md +106 -0
- package/skills/repo-maintenance/references/stack-profiles.md +138 -0
- package/skills/repo-maintenance/scripts/audit_repo_maintenance.py +1198 -0
- package/skills/repo-maintenance/scripts/test_audit_repo_maintenance.py +506 -0
- package/skills/repository-intelligence/SKILL.md +189 -0
- package/skills/repository-intelligence/agents/openai.yaml +4 -0
- package/skills/repository-intelligence/references/assessment-rubric.md +88 -0
- package/skills/repository-intelligence/scripts/repository_inventory.py +347 -0
- package/skills/research/SKILL.md +12 -2
- package/skills/root-cause-analysis/SKILL.md +1 -1
- package/skills/runtime-parity-verification/SKILL.md +36 -1
- package/skills/security-methodology/SKILL.md +22 -9
- package/skills/security-methodology/references/agentic-handoff-templates.md +220 -0
- package/skills/security-methodology/references/cross-source-matrix.md +1 -1
- package/skills/security-methodology/references/owasp-agentic-top-10.md +1 -1
- package/skills/security-scan/SKILL.md +55 -15
- package/skills/self-improve/SKILL.md +70 -50
- package/skills/silent-assumptions/SKILL.md +341 -0
- package/skills/silent-assumptions/references/elicitation-detectors.md +342 -0
- package/skills/spec-writing/SKILL.md +128 -24
- package/skills/spec-writing/scripts/check_checklist.py +114 -15
- package/skills/ui-design/SKILL.md +6 -4
- package/skills/ui-design/references/color-engine.md +132 -0
- package/skills/ui-design/references/design-preferences-from-owned-apps.md +8 -8
- package/skills/ui-design/references/ui-guidance-sources.md +1 -1
- package/skills/ui-design/references/universal-design-principles.alt.md +2 -2
- package/plugin-artifacts/codex/.codex-plugin/plugin.json +0 -41
- package/plugin-artifacts/codex/AGENTS.md +0 -560
- package/plugin-artifacts/codex/BUILD-ARTIFACT.md +0 -5
- package/plugin-artifacts/codex/LICENSE +0 -202
- package/plugin-artifacts/codex/README.md +0 -313
- package/plugin-artifacts/codex/assets/build-loop-plugin-icon.png +0 -0
- package/plugin-artifacts/codex/docs/agent-surface-policy.md +0 -63
- package/plugin-artifacts/codex/references/advisor-dispatch-ladder.md +0 -62
- package/plugin-artifacts/codex/references/agent-role-taxonomy.md +0 -135
- package/plugin-artifacts/codex/references/autonomous-and-per-commit-modes.md +0 -161
- package/plugin-artifacts/codex/references/autonomy-config.md +0 -231
- package/plugin-artifacts/codex/references/backlog-system.md +0 -285
- package/plugin-artifacts/codex/references/capability-routing.md +0 -231
- package/plugin-artifacts/codex/references/codex-subagents.md +0 -106
- package/plugin-artifacts/codex/references/coordination-file-template.md +0 -181
- package/plugin-artifacts/codex/references/coordination-rules.md +0 -552
- package/plugin-artifacts/codex/references/dogfood-reload-checkpoint.md +0 -112
- package/plugin-artifacts/codex/references/halt-and-ask-protocol.md +0 -102
- package/plugin-artifacts/codex/references/implementer-envelope-schema.md +0 -302
- package/plugin-artifacts/codex/references/intent-capability-pack.md +0 -257
- package/plugin-artifacts/codex/references/intent-exploration-prompts.md +0 -96
- package/plugin-artifacts/codex/references/leadership.md +0 -72
- package/plugin-artifacts/codex/references/memory-systems.md +0 -261
- package/plugin-artifacts/codex/references/memory.md +0 -313
- package/plugin-artifacts/codex/references/model-tier-mapping.md +0 -296
- package/plugin-artifacts/codex/references/modular-systems-pack.md +0 -96
- package/plugin-artifacts/codex/references/phase-1-assess.md +0 -249
- package/plugin-artifacts/codex/references/phase-2-plan.md +0 -86
- package/plugin-artifacts/codex/references/phase-3-execute.md +0 -49
- package/plugin-artifacts/codex/references/phase-4-review.md +0 -341
- package/plugin-artifacts/codex/references/phase-5-iterate.md +0 -72
- package/plugin-artifacts/codex/references/phase-6-learn.md +0 -58
- package/plugin-artifacts/codex/references/recent-design-structures.md +0 -274
- package/plugin-artifacts/codex/references/research-trigger-policy.md +0 -140
- package/plugin-artifacts/codex/references/runtime-smoke-triggers.md +0 -42
- package/plugin-artifacts/codex/references/self-review.md +0 -234
- package/plugin-artifacts/codex/references/single-writer-commit-protocol.md +0 -90
- package/plugin-artifacts/codex/references/task-capture-policy.md +0 -68
- package/plugin-artifacts/codex/references/ui-io-contract.md +0 -116
- package/plugin-artifacts/codex/references/ui-spotcheck-protocol.md +0 -65
- package/plugin-artifacts/codex/references/verify-dispatch.md +0 -85
- package/plugin-artifacts/codex/skills/build-loop/SKILL.md +0 -381
- package/plugin-artifacts/codex/skills/build-loop/detect-plugins.mjs +0 -82
- package/plugin-artifacts/codex/skills/build-loop/eval-guide.md +0 -65
- package/plugin-artifacts/codex/skills/build-loop/fallbacks.md +0 -549
- package/plugin-artifacts/codex/skills/build-loop/phases/fact-check.md +0 -42
- package/plugin-artifacts/codex/skills/build-loop/phases/ui-validation.md +0 -267
- package/plugin-artifacts/codex/skills/build-loop/references/advisor-dispatch-ladder.md +0 -62
- package/plugin-artifacts/codex/skills/build-loop/references/apple-native-planning.md +0 -439
- package/plugin-artifacts/codex/skills/build-loop/references/autonomous-and-per-commit-modes.md +0 -161
- package/plugin-artifacts/codex/skills/build-loop/references/capability-routing.md +0 -231
- package/plugin-artifacts/codex/skills/build-loop/references/codex-subagents.md +0 -106
- package/plugin-artifacts/codex/skills/build-loop/references/coordination.md +0 -161
- package/plugin-artifacts/codex/skills/build-loop/references/correction-aware-capture.md +0 -177
- package/plugin-artifacts/codex/skills/build-loop/references/experiment-results-template.md +0 -101
- package/plugin-artifacts/codex/skills/build-loop/references/independent-auditor.md +0 -72
- package/plugin-artifacts/codex/skills/build-loop/references/intent-capability-pack.md +0 -257
- package/plugin-artifacts/codex/skills/build-loop/references/intent-exploration-prompts.md +0 -96
- package/plugin-artifacts/codex/skills/build-loop/references/leadership.md +0 -72
- package/plugin-artifacts/codex/skills/build-loop/references/memory.md +0 -313
- package/plugin-artifacts/codex/skills/build-loop/references/modular-systems-pack.md +0 -96
- package/plugin-artifacts/codex/skills/build-loop/references/output-style.md +0 -222
- package/plugin-artifacts/codex/skills/build-loop/references/pay-it-forward-arch.md +0 -98
- package/plugin-artifacts/codex/skills/build-loop/references/phase-1-assess.md +0 -249
- package/plugin-artifacts/codex/skills/build-loop/references/phase-2-plan.md +0 -86
- package/plugin-artifacts/codex/skills/build-loop/references/phase-3-execute.md +0 -49
- package/plugin-artifacts/codex/skills/build-loop/references/phase-4-review.md +0 -341
- package/plugin-artifacts/codex/skills/build-loop/references/phase-5-iterate.md +0 -72
- package/plugin-artifacts/codex/skills/build-loop/references/phase-6-learn.md +0 -58
- package/plugin-artifacts/codex/skills/build-loop/references/recent-design-structures.md +0 -274
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/ASSESSMENT.md +0 -85
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/STANDALONE_TEST_RUN.md +0 -149
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/01-simple-bugfix.md +0 -32
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/02-ui-build-with-iteration.md +0 -48
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/03-multi-failure-escalation.md +0 -60
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/04-ui-build-ibr-absent.md +0 -51
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/05-refactor-navgator-absent.md +0 -71
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/scenarios/06-recurring-bug-debugger-absent.md +0 -52
- package/plugin-artifacts/codex/skills/build-loop/references/refactor-history/trace-comparison.md +0 -202
- package/plugin-artifacts/codex/skills/build-loop/references/self-recursive-dev.md +0 -77
- package/plugin-artifacts/codex/skills/build-loop/references/self-review.md +0 -234
- package/plugin-artifacts/codex/skills/build-loop/references/ui-io-contract.md +0 -116
- package/plugin-artifacts/codex/skills/build-loop/references/verify-dispatch.md +0 -85
- package/plugin-artifacts/codex/skills/build-loop/scanners/audit-design-rules.mjs +0 -476
- package/plugin-artifacts/codex/skills/build-loop/scanners/require-visual-evidence.mjs +0 -239
- package/plugin-artifacts/codex/skills/build-loop/templates/backlog-item.md +0 -35
- package/plugin-artifacts/codex/skills/build-loop/templates/codex-worker-prompt.md +0 -100
- package/plugin-artifacts/codex/skills/build-loop/templates/ui-subagent-prompt.md +0 -179
- package/plugin-artifacts/codex/skills/build-loop/templates/ux-fix-plan.md +0 -40
- package/scripts/build_codex_plugin_artifact.py +0 -321
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: build-loop:self-improve
|
|
3
|
-
description:
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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.
|
|
29
|
-
│ emits
|
|
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 →
|
|
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 →
|
|
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.
|
|
49
|
+
### 1. Run and read the receipt
|
|
45
50
|
|
|
46
51
|
```
|
|
47
|
-
|
|
48
|
-
|
|
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 `
|
|
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
|
-
|
|
58
|
+
### 2. Trust the runner boundary
|
|
62
59
|
|
|
63
|
-
|
|
60
|
+
The runner owns detection, filtering, deduplication, and the two-pattern cap. Do not repeat these decisions in the caller.
|
|
64
61
|
|
|
65
|
-
|
|
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.
|
|
68
|
+
### 4. Attest and review
|
|
78
69
|
|
|
79
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
154
|
+
### `.build-loop/state.json.runs[]` extensions (writer: build-orchestrator during Review-G)
|
|
164
155
|
|
|
165
|
-
Review
|
|
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.
|
|
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
|
|
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
|
-
##
|
|
309
|
+
## Agent dispatch (this skill)
|
|
290
310
|
|
|
291
|
-
| Step |
|
|
311
|
+
| Step | Dispatch rule |
|
|
292
312
|
|---|---|
|
|
293
|
-
| 1. Detect |
|
|
294
|
-
| 3. Draft | self-improvement-architect
|
|
295
|
-
| 4. Signoff |
|
|
296
|
-
| 6. Notify |
|
|
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
|
-
|
|
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`).
|