@tyroneross/build-loop 0.36.0 → 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 +11 -5
- 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 +56 -2
- 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 +23 -10
- 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
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<!-- Canonical: how build-loop reports findings, status, and recommendations to a human.
|
|
2
|
+
Adopted 2026-08-18 after four rounds of correction in one session. The progression
|
|
3
|
+
is preserved in §7 on purpose — each failed attempt fixed a different level of the
|
|
4
|
+
Leverage Stack while the sentence stayed unusable, which is the lesson.
|
|
5
|
+
Companion to references/output-style.md (sentence level) and the style-calibrator
|
|
6
|
+
"Leverage Stack" profile (message logic). This file governs the SHAPE of a status
|
|
7
|
+
block; those govern the sentences inside it. Reference this file, do not restate it. -->
|
|
8
|
+
|
|
9
|
+
# Status & findings output format
|
|
10
|
+
|
|
11
|
+
## 1. Who this is for, and when it applies
|
|
12
|
+
|
|
13
|
+
You are an agent emitting a **user-facing report**: findings, open items, status
|
|
14
|
+
updates, recommendations. Your reader is deciding what to do next, not reading for
|
|
15
|
+
comprehension.
|
|
16
|
+
|
|
17
|
+
**Applies to:** Phase 4 reports, review findings, queue items, handoff documents,
|
|
18
|
+
commit-worthy summaries, any list of open work, any recommendation.
|
|
19
|
+
|
|
20
|
+
**Does NOT apply to:**
|
|
21
|
+
- Structured internal envelopes (subagent JSON returns, run records, judge
|
|
22
|
+
decisions, MECE briefs). Those exist for machines and are unconstrained.
|
|
23
|
+
- Conversational replies, single-answer questions, and status one-liners. A
|
|
24
|
+
question that wants a sentence gets a sentence.
|
|
25
|
+
- Code, commit bodies, and test names, which have their own conventions.
|
|
26
|
+
|
|
27
|
+
If you are unsure whether a response is a status report, ask: *does the reader have
|
|
28
|
+
to decide or act because of this?* If yes, use this format.
|
|
29
|
+
|
|
30
|
+
## 2. The governing test — write for a cold reader
|
|
31
|
+
|
|
32
|
+
**If a new agent with zero context read only this line, would it know what to do?**
|
|
33
|
+
|
|
34
|
+
Not "is it short." Not "is it plain." Is it *actionable by someone who was not in
|
|
35
|
+
the room*. A sentence fails when the reader cannot tell whether to remember it,
|
|
36
|
+
decide something, act, or ignore it.
|
|
37
|
+
|
|
38
|
+
This is the rule. Everything in §4 is a consequence of it — a block that satisfies
|
|
39
|
+
every rule in §4 and still fails this test is wrong, and the rules are what yield.
|
|
40
|
+
|
|
41
|
+
## 3. Three things every sentence carries
|
|
42
|
+
|
|
43
|
+
| element | what it means | good | bad |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| **Actor — who** | a named person or system | `We`, `you`, `the guard`, `an installed user` | `two lookups`, `the resolvers`, `it` |
|
|
46
|
+
| **Object — what** | concrete enough to build or verify | `one code path per model tier` | `different models`, `some issues` |
|
|
47
|
+
| **Modality — what kind of statement** | requirement / fact / done / decision owed | `We need X`, `Today we have Y`, `I've done Z`, `Should we A or B?` | anything the reader must infer |
|
|
48
|
+
|
|
49
|
+
**If you cannot name the actor, you do not yet understand the finding.** Go back to
|
|
50
|
+
the code before you write the line.
|
|
51
|
+
|
|
52
|
+
## 4. The block
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
[Action-verb phrase naming the specific thing, real numbers/names/dates inline]
|
|
56
|
+
[One sentence: what breaks, for whom, when.]
|
|
57
|
+
- [Every affected item, named individually, with its own detail]
|
|
58
|
+
- [The fix, stated as an action]
|
|
59
|
+
- [The ask: "I've started this and will update you when done"
|
|
60
|
+
OR "I need your approval to do this" + why]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
One block per item. No preamble, no wrap-up paragraph.
|
|
64
|
+
|
|
65
|
+
### 4.1 Heading is a phrase, not a sentence
|
|
66
|
+
|
|
67
|
+
Action verb + the concrete noun doing or receiving the action, real values inline.
|
|
68
|
+
No trailing em-dash explainer. The noun carrying the stake is the subject.
|
|
69
|
+
|
|
70
|
+
- ✅ `2 Groq models shut down on 2026-08-16`
|
|
71
|
+
- ✅ `Unpushed commits keep the fixes off your users' machines`
|
|
72
|
+
- ✅ `Seven broken tests hide the next real break`
|
|
73
|
+
- ❌ `A deliberate expiry alarm on your Groq model facts fired 4 days ago — it's a staleness timer, not a bug.` (sentence + explainer)
|
|
74
|
+
- ❌ `Groq catalog issue` (no verb, no stake)
|
|
75
|
+
- ❌ `The suite has failures` (container as subject, not the stake)
|
|
76
|
+
|
|
77
|
+
### 4.2 Second line is the consequence, not a restatement
|
|
78
|
+
|
|
79
|
+
What breaks, for whom, when. Falsifiable and specific.
|
|
80
|
+
|
|
81
|
+
- ✅ `Work quietly goes to the wrong model instead of erroring.`
|
|
82
|
+
- ✅ `The people installing your plugin are still hitting every problem we fixed.`
|
|
83
|
+
- ❌ `This could cause problems down the line.`
|
|
84
|
+
- ❌ `This is important to address.`
|
|
85
|
+
|
|
86
|
+
**This line is a relevance filter, not decoration.** If you cannot write it, the
|
|
87
|
+
item does not belong in the response. That is the test for cutting.
|
|
88
|
+
|
|
89
|
+
### 4.3 Shape: target state first, then the gap
|
|
90
|
+
|
|
91
|
+
State what should be true, then what is true today. Diagnosis-first framing —
|
|
92
|
+
explaining how the defect works — reads as precision and transfers no decision.
|
|
93
|
+
Mechanism belongs in the fix or the spec; it goes up top ONLY when it changes which
|
|
94
|
+
option the reader picks.
|
|
95
|
+
|
|
96
|
+
### 4.4 Plain words, not jargon
|
|
97
|
+
|
|
98
|
+
The test is not "is this technical." It is: **could a competent engineer who has
|
|
99
|
+
never seen this project understand it?**
|
|
100
|
+
|
|
101
|
+
**KEEP** universal vocabulary — translating it adds nothing and reads as
|
|
102
|
+
condescending: `push to origin`, `push to main`, `merge`, `rebase`, `stash`,
|
|
103
|
+
`pull request`, `regression`, `race condition`, `cache`, `timeout`, `schema`,
|
|
104
|
+
`dependency`, plus filenames, flags, env vars, and anything the reader will type.
|
|
105
|
+
|
|
106
|
+
**TRANSLATE** project-internal vocabulary, whose meaning lives only in this codebase:
|
|
107
|
+
|
|
108
|
+
| internal | plain |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `private slugs` | the short names of your private projects |
|
|
111
|
+
| `T3/T4 routing` | which model does the work |
|
|
112
|
+
| `the ratchet baseline` | the list of already-known problems the check ignores |
|
|
113
|
+
| `public-boundary issue` | published in your public repo |
|
|
114
|
+
|
|
115
|
+
Plain words alone are not enough. A plainer sentence that still fails §2 is not an
|
|
116
|
+
improvement — see the progression in §7.
|
|
117
|
+
|
|
118
|
+
### 4.5 Name every specific individually
|
|
119
|
+
|
|
120
|
+
`2 models affected` is a headline, not information. List each with its own date,
|
|
121
|
+
replacement, or detail so the reader can act per item.
|
|
122
|
+
|
|
123
|
+
### 4.6 Always close with a decision or a status
|
|
124
|
+
|
|
125
|
+
Two forms only:
|
|
126
|
+
- `I've started this and will update you when done.`
|
|
127
|
+
- `I need your approval to do this.` — and say why approval is needed.
|
|
128
|
+
|
|
129
|
+
Never end a finding with no disposition.
|
|
130
|
+
|
|
131
|
+
## 5. Accuracy
|
|
132
|
+
|
|
133
|
+
State only what you verified, and say how. Mark anything assumed or unchecked.
|
|
134
|
+
If you previously said something wrong, correct it in one plain sentence and move
|
|
135
|
+
on — do not bury it, do not dwell on it.
|
|
136
|
+
|
|
137
|
+
Do not inflate impact to justify reporting something. **If the real impact is low,
|
|
138
|
+
say it is low.** A reader who catches you inflating once discounts everything after.
|
|
139
|
+
|
|
140
|
+
## 6. Before you send — verify each block
|
|
141
|
+
|
|
142
|
+
Run this check on every block. Any "no" means rewrite, not ship.
|
|
143
|
+
|
|
144
|
+
1. Could an agent with zero context act on the heading alone?
|
|
145
|
+
2. Does every sentence name an actor, a specific object, and its modality?
|
|
146
|
+
3. Is the second line a consequence, or a restatement in different words?
|
|
147
|
+
4. Does the heading lead with the target state rather than the diagnosis?
|
|
148
|
+
5. Is every remaining technical term one the reader will actually type?
|
|
149
|
+
6. Does the block end with a decision or a status?
|
|
150
|
+
7. Would you be comfortable if this line were quoted back with no surrounding text?
|
|
151
|
+
|
|
152
|
+
## 7. Worked progression — why the near-misses fail
|
|
153
|
+
|
|
154
|
+
Real sequence from the session that produced this file. Each attempt fixed a
|
|
155
|
+
different level and the sentence stayed unusable, because the defect was in message
|
|
156
|
+
logic the whole time.
|
|
157
|
+
|
|
158
|
+
**Original (jargon):** *"The resolvers disagree on T3/T4."*
|
|
159
|
+
Project-internal vocabulary; meaningless outside this codebase.
|
|
160
|
+
|
|
161
|
+
**Attempt 1 — FAILS:** *"Two lookups pick different models."*
|
|
162
|
+
Plainer, and no more useful. No actor, no target, no modality. The reader asks "why
|
|
163
|
+
would they?" and has nothing to do next.
|
|
164
|
+
|
|
165
|
+
**Attempt 2 — ALSO FAILS:** *"Ask for the same tier two different ways and you get
|
|
166
|
+
two different models back — one path sorts by release date, the other by capability
|
|
167
|
+
rank."*
|
|
168
|
+
Accurate, and still wrong. Diagnosis-first: it explains the internals, so the reader
|
|
169
|
+
now understands the bug and still has to work out what to do about it.
|
|
170
|
+
|
|
171
|
+
**PASSES:**
|
|
172
|
+
```
|
|
173
|
+
We need one code path per model tier
|
|
174
|
+
Today we have 2+ paths, with inconsistent results
|
|
175
|
+
```
|
|
176
|
+
Actor (`we`), specific object (`one code path per model tier`), modality (`need` =
|
|
177
|
+
requirement). Target state first, gap second. Longer than attempt 1 — length was
|
|
178
|
+
never the goal.
|
|
179
|
+
|
|
180
|
+
## 8. Worked example — a full block
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
2 Groq models shut down on 2026-08-16
|
|
184
|
+
Anything still pointing at them fails outright, and the catalog lists them as
|
|
185
|
+
live, so the next person to read it picks a dead model.
|
|
186
|
+
|
|
187
|
+
- llama-3.1-8b-instant — shut down 2026-08-16, replacement openai/gpt-oss-20b
|
|
188
|
+
- llama-3.3-70b-versatile — shut down 2026-08-16, replacements
|
|
189
|
+
openai/gpt-oss-120b and qwen/qwen3.6-27b
|
|
190
|
+
- Both were free + developer plan only; enterprise spend unaffected
|
|
191
|
+
- To fix: re-read Groq's official docs, update all 15 entries, mark those 2
|
|
192
|
+
retired, and move the re-check date forward
|
|
193
|
+
- I need your approval — this needs live doc lookups, and I will not move the
|
|
194
|
+
date without doing them
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## 9. Escape hatches
|
|
198
|
+
|
|
199
|
+
- **Nothing to report.** Say so in one line. Do not manufacture blocks to fill a
|
|
200
|
+
report.
|
|
201
|
+
- **You cannot name the modality.** That means you do not know whether it is a
|
|
202
|
+
requirement, a fact, or a decision. Find out before writing, or state the
|
|
203
|
+
uncertainty explicitly as the finding: *"I do not know whether X is intended
|
|
204
|
+
behaviour or a defect; deciding needs Y."*
|
|
205
|
+
- **The item is genuinely trivial.** One line, no block. Format overhead on a typo
|
|
206
|
+
is noise.
|
|
207
|
+
- **A rule fights the cold-read test.** §2 wins. Say which rule you broke and why.
|
|
@@ -15,7 +15,7 @@ Walk this after any dispatched Agent, Task, or orchestrator sub-agent (including
|
|
|
15
15
|
|
|
16
16
|
Ground truth comes from commands you run yourself, not from prose the agent returned.
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## 6-Step Verification Checklist
|
|
19
19
|
|
|
20
20
|
Run these yourself. Do not echo the agent's report back as your own finding.
|
|
21
21
|
|
|
@@ -77,9 +77,63 @@ State the outcome in this form:
|
|
|
77
77
|
|
|
78
78
|
Never emit "the agent confirmed it passed" as your own verification line. Name which commands you ran and what they returned. If a step was skipped, say why.
|
|
79
79
|
|
|
80
|
+
### 6 — Re-execute the literal command behind each headline verification claim
|
|
81
|
+
|
|
82
|
+
Steps 1–3 verify the *repo*. This step verifies the *claim*. A subagent's headline usually names the command it says it ran and the outcome it says it got — re-run that exact command and compare.
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
python3 "${CLAUDE_PLUGIN_ROOT:-.}/scripts/verification_claim_probe.py" \
|
|
86
|
+
--report-file <the subagent's returned report> --markdown
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The probe extracts command-shaped claims (a backticked command sitting next to a verification verb — *verified*, *confirmed*, *reproduced*, *ran*, *tested*, *proved*, *exit N*, *N passed*), re-runs each one, and labels it:
|
|
90
|
+
|
|
91
|
+
- **`executed:`** — we ran it and every stated expectation held.
|
|
92
|
+
- **`contradicted:`** — we ran it and an expectation failed. **Exit code 1.** This is a real finding; it goes in the report, not in a footnote.
|
|
93
|
+
- **`cited:`** — we did not run it. Either no expectation was stated to check against, or the command is not safely re-executable.
|
|
94
|
+
|
|
95
|
+
**Exit 2 = `nothing_executed`.** Zero claims extracted, or every claim refused, or every claim ran with no expectation to check — the probe verified nothing. Treat exit 2 as "unverified", never as "clean"; a run we could not observe is not a pass.
|
|
96
|
+
|
|
97
|
+
The safety layer is an **allowlist, not a deny-list**, because the commands come from LLM-authored report text and you cannot enumerate what a model might emit. Only verification-shaped heads run (`pytest`, `python3`, `node`, `npm test`, `cargo test`, `go test`, `swift test`, `ruff`, `mypy`, `tsc`, `eslint`, `jest`, `vitest`, `jq`, …), any shell metacharacter or redirection refuses outright, and a `git` command is delegated to `scripts/audit_git.py`'s classifier so the two scripts cannot drift on what counts as safe. Everything else is `cited`. Denied commands are **never executed** — the probe must not become the thing that writes to a live store.
|
|
98
|
+
|
|
99
|
+
Carry the `executed:` / `contradicted:` / `cited:` label into the report for every relayed claim. An unlabeled claim is `cited:` by default — you read it, you did not verify it.
|
|
100
|
+
|
|
101
|
+
**Why this step exists.** 2026-08-07: four subagent reports arrived with the safety classifier unavailable. One reported a security fix as *"Fixed — guard refuses the live store; verified by reproducing the auditor's exact attack (exit 2, store still 0)."* Running that exact command against the shipped code gave **exit 0 and 49 entries written into the user's live store**. The guard required its flag only on the branch where the path was omitted; naming the path explicitly walked straight past it. Steps 1–3 would all have passed — the commits existed, the tree was clean, the suite was green. Only re-running the claim's own command caught it.
|
|
102
|
+
|
|
103
|
+
### 7 — Confirm the run record landed in the workdir you dispatched into
|
|
104
|
+
|
|
105
|
+
A dispatched orchestrator that returns a polished report has not necessarily closed its run. Assert the `runs[]` mutation yourself, against the workdir you dispatched INTO (not your own session's cwd — they differ whenever you dispatch into a sibling repo, a plugin subdirectory, or a worktree):
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# The envelope named a run_id — assert that exact record:
|
|
109
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/run_close_lint.py" \
|
|
110
|
+
--workdir <dispatch-target-workdir> --run-id <run_id> --require-orchestrator --require-learn --json
|
|
111
|
+
|
|
112
|
+
# No run_id in the envelope (the common shape when Review-G was skipped entirely):
|
|
113
|
+
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/run_close_lint.py" \
|
|
114
|
+
--workdir <dispatch-target-workdir> --expect-recent-minutes --require-orchestrator --require-learn --json
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Exit 1 means the run is not closed and Phase 6 Learn cannot see it. Do not accept the completion: either re-dispatch the orchestrator's Review-G run-close step, or write the record yourself from the envelope's own contents using the printed `remediation` command. A `no_state` status is the loudest case — the target workdir has no `.build-loop/state.json` at all, so that run produced no durable artifact of any kind (check whether the orchestrator actually worked in the workdir you think it did).
|
|
118
|
+
|
|
119
|
+
Worked evidence (2026-07-16): six sequential dispatched `build-orchestrator` agents in `ObsidianVault/.obsidian/plugins/daily-planner` each completed with a high-quality report and wrote no `runs[]` entry, retrospective, milestone, or feedback line; the only rows in the vault's `state.json` came from Stop hooks. Every report read as success, so nothing surfaced until a retrospective counted the missing records a day later. Step 6 is a single command that would have caught the first one. The orchestrator-side half of this contract is the Review-G assertion in `references/phase-4-review.md` §"Run-close assertion" — that one catches a write that was attempted and failed; this one catches a run that never reached Review-G.
|
|
120
|
+
|
|
121
|
+
## Auditing verdict / classification claims (DONE · PASS · verified)
|
|
122
|
+
|
|
123
|
+
When a dispatched agent returns *verdicts* — "DONE", "PASS", "already implemented", "complete", "verified" — audit each verdict against the cited evidence, not against its title. An over-optimistic DONE hides a real gap far more often than a REJECT does; the failure mode is **claiming a nearby mechanism satisfies the requirement when it only partially does** ("adjacent" and "partial" read as DONE).
|
|
124
|
+
|
|
125
|
+
Run the audit as a **second, adversarial pass — a different model where possible** (e.g. Codex when the harness was Claude), prompted to REFUTE, not confirm:
|
|
126
|
+
|
|
127
|
+
- For every DONE / PASS, open the cited `path:line` and confirm the named control **actually satisfies the requirement** — not merely that a related file exists or a similar mechanism is nearby.
|
|
128
|
+
- Default to skepticism on DONE; a verdict carrying no `path:line` evidence is unverified by definition.
|
|
129
|
+
- Spend the adversarial budget on the DONE claims; sanity-check the rest (ADOPT genuinely not-yet-done, DEFER not actually adoptable).
|
|
130
|
+
- Report corrections as `<id> · claimed <verdict> · actually <truth> · correct <verdict>` with evidence `path:line`.
|
|
131
|
+
|
|
132
|
+
Worked evidence (2026-07-08, this repo): a Codex audit of a 13-item triage corrected **3 of 9 "DONE" verdicts to ADOPT** (partial/adjacent), each confirmed against `stop_closeout.py` / `session_end_retro_sweep.py`; a separate pre-push Codex audit caught **3 over-optimistic passes** (fire-scope over-firing on runs, a `tempfile` name the scratch-guard missed, a SessionEnd hook the plugin didn't actually ship). A single self-classification pass would have shipped all six.
|
|
133
|
+
|
|
80
134
|
## What this does NOT replace
|
|
81
135
|
|
|
82
136
|
- **runtime-parity-verification** — that skill cross-checks a running app's UI against backend state. This checklist covers the git/test layer only.
|
|
83
137
|
- **plan-verify** — that skill lints a plan's evidence claims before Phase 2 acceptance. This checklist fires after a dispatch reports completion.
|
|
84
138
|
|
|
85
|
-
Origin lessons: `feedback_solicited_peer_review_is_not_independent.md`, `feedback_buildloop_verify_auditor_ran.md`, `feedback_verify_running_app_not_compile_green.md`.
|
|
139
|
+
Origin lessons: `feedback_solicited_peer_review_is_not_independent.md`, `feedback_buildloop_verify_auditor_ran.md`, `feedback_verify_running_app_not_compile_green.md`, `feedback_duplicate_claim_pivot_to_verifier.md`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: building-with-deepagents
|
|
3
|
-
description:
|
|
3
|
+
description: Build or refactor an agent using the OSS `deepagents` framework (SubAgent API, middleware, tool scoping, streaming, checkpointing). Use when the user wants a multi-agent/subagent system built with deepagents, or the code imports it. Not for `.claude/agents/*.md` definitions.
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: claim-scope
|
|
3
|
+
description: "Name the LAYER a claim lives at (working tree / repository / deployed / live behavior) and check that your instrument can reach it, before stating any fact about a system. Triggers on assertion words (is / never / only / verified / cannot) and on 'does X exist', 'did X ship'. Not for grading evidence STRENGTH ([measured]/[correlated]/[reasoned]) — that is report_lint's mechanism-claim rule, which this extends with reach. A grep proves what is in one checkout; it can say nothing about what is running. Verify right-to-left: start at observed behavior, walk back toward source."
|
|
4
|
+
user-invocable: false
|
|
5
|
+
companion_scripts:
|
|
6
|
+
- scripts/claim_scope_lint.py — the deterministic half. Flags a claim whose subject layer exceeds the reach of every instrument named on the line.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<!-- SPDX-FileCopyrightText: 2025-2026 Tyrone Ross, Jr <46267523+tyroneross@users.noreply.github.com> | SPDX-License-Identifier: Apache-2.0 -->
|
|
10
|
+
|
|
11
|
+
# Claim Scope
|
|
12
|
+
|
|
13
|
+
**The defect this prevents:** an agent runs a correct check, then states a
|
|
14
|
+
conclusion the check could not support, with full confidence and no hedge. The
|
|
15
|
+
check is not wrong. The *reach* of the check is wrong, and nothing in the
|
|
16
|
+
sentence records the difference.
|
|
17
|
+
|
|
18
|
+
Observed 2026-09-04. An agent grepped `@vercel/blob` in a local checkout of
|
|
19
|
+
a private app repo, found nothing, and reported: *"there is no blob path; the audio
|
|
20
|
+
lives only in Postgres; switching source is not possible."* The grep was
|
|
21
|
+
accurate. The checkout sat on a branch whose last commit was a day old, while
|
|
22
|
+
`origin/main` carried a merged blob migration that was **already deployed to
|
|
23
|
+
production**. The agent had reported a property of one working tree as a
|
|
24
|
+
property of the running system. Existing lint passed it clean, because the
|
|
25
|
+
sentence named its instrument (`grep`) and the mechanism-claim rule accepts
|
|
26
|
+
`grep` as an observation.
|
|
27
|
+
|
|
28
|
+
**Naming your instrument is not enough. The instrument must be able to see the
|
|
29
|
+
thing you are claiming.**
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## The four layers
|
|
34
|
+
|
|
35
|
+
Every claim about a software system lives at exactly one of these. Decide which
|
|
36
|
+
one BEFORE writing the sentence.
|
|
37
|
+
|
|
38
|
+
| Layer | The claim is about | Nothing below it can prove this |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| **L1 · working tree** | this branch, this directory, right now | — |
|
|
41
|
+
| **L2 · repository** | origin, every branch, every worktree | L1 sees one branch of many |
|
|
42
|
+
| **L3 · deployed** | what is built and shipped and serving | L2 sees intent, not what shipped |
|
|
43
|
+
| **L4 · live behavior** | what it does when a person touches it | L3 sees the artifact, not its behavior |
|
|
44
|
+
|
|
45
|
+
The layers are a ladder, not a menu. **A claim at layer N requires an instrument
|
|
46
|
+
that reaches layer N.** Reaching higher is free and always valid; reaching lower
|
|
47
|
+
is the defect.
|
|
48
|
+
|
|
49
|
+
## Instrument reach — the lookup
|
|
50
|
+
|
|
51
|
+
Do not reason about this. Look it up.
|
|
52
|
+
|
|
53
|
+
| Instrument | Reaches | Blind to |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `grep`, `cat`, `sed`, Read, Glob, reading a file | **L1** | other branches, other worktrees, what shipped, what it does |
|
|
56
|
+
| `git log`, `git status`, `git diff` (no fetch) | **L1** | anything not yet fetched |
|
|
57
|
+
| `git fetch --all` + `git log HEAD..origin/<branch>` | **L2** | whether it built or shipped |
|
|
58
|
+
| `git worktree list`, `git branch -a`, `gh pr list` | **L2** | same |
|
|
59
|
+
| `vercel ls` / `vercel inspect`, `gh run list`, deploy sha, build log | **L3** | runtime behavior under a real request |
|
|
60
|
+
| `curl -D-`, a real HTTP request, a screenshot, `ibr scan`, an AX probe, a live DB query | **L4** | nothing — this is the ground |
|
|
61
|
+
|
|
62
|
+
Two instruments that look similar and are not: `git log` reports what you have
|
|
63
|
+
fetched; `git log HEAD..origin/main` after a fetch reports what exists. The
|
|
64
|
+
first is L1. The second is L2.
|
|
65
|
+
|
|
66
|
+
## Procedure
|
|
67
|
+
|
|
68
|
+
Run this whenever a claim is about to be stated, not only when you doubt it.
|
|
69
|
+
Doubt is the thing that fails first.
|
|
70
|
+
|
|
71
|
+
**1. Write the claim as a sentence.** Then read it back and answer: *which layer
|
|
72
|
+
is this a claim about?* If the sentence contains "is deployed", "is running",
|
|
73
|
+
"is broken", "does not exist anywhere", "nothing does X" — it is L3 or L4, no
|
|
74
|
+
matter what you looked at.
|
|
75
|
+
|
|
76
|
+
**2. Look up the reach of every instrument you actually ran.** Not the ones you
|
|
77
|
+
could have run. The ones in your transcript.
|
|
78
|
+
|
|
79
|
+
**3. Compare.** If `max(instrument reach) < claim layer`, you have two legal
|
|
80
|
+
moves and no third:
|
|
81
|
+
- **Go get the higher-layer evidence.** Usually cheap: one `git fetch`, one
|
|
82
|
+
`curl -D-`, one `vercel ls`.
|
|
83
|
+
- **Rewrite the claim down to the layer you actually reached**, explicitly:
|
|
84
|
+
*"no blob dependency in the working tree of `fix/embedding-failures` at
|
|
85
|
+
`3fe5298`"*. This is honest and often still useful.
|
|
86
|
+
|
|
87
|
+
Stating the higher-layer claim anyway is the defect. There is no "probably".
|
|
88
|
+
|
|
89
|
+
**4. Stamp the time.** An L4 observation is true at its timestamp and nowhere
|
|
90
|
+
else. Record when you looked, not when you are speaking.
|
|
91
|
+
|
|
92
|
+
**5. Re-run before repeating.** Before restating an earlier L3/L4 result later in
|
|
93
|
+
the same session, re-run it. In the 2026-09-04 incident a correct `curl` at
|
|
94
|
+
05:32Z was still being quoted at 07:47Z; the deploy that falsified it landed at
|
|
95
|
+
07:07Z, inside the same conversation.
|
|
96
|
+
|
|
97
|
+
## Verify right-to-left
|
|
98
|
+
|
|
99
|
+
Default direction: **start at L4 and walk left toward source.**
|
|
100
|
+
|
|
101
|
+
Left-to-right (read source → infer behavior → assert it) manufactures confident
|
|
102
|
+
wrong answers, because the source you are looking at may not be the source that
|
|
103
|
+
is running. You cannot detect that from inside the source.
|
|
104
|
+
|
|
105
|
+
Right-to-left (observe behavior → explain it from the artifact → trace to the
|
|
106
|
+
code that produced it) cannot make that error. The rightmost layer is the only
|
|
107
|
+
one that cannot be stale about itself.
|
|
108
|
+
|
|
109
|
+
Worked example, the same incident done correctly:
|
|
110
|
+
|
|
111
|
+
- **L4 first.** `curl -D- -H "Range: bytes=0-1023"` → `HTTP 200`,
|
|
112
|
+
`accept-ranges: none`. *Seeking is broken right now.* True regardless of any
|
|
113
|
+
repo state.
|
|
114
|
+
- **L3 next.** `vercel ls` → production deploy Ready at 00:07:16 PDT.
|
|
115
|
+
`gh run list` → CI red on that commit. *The blob code shipped.*
|
|
116
|
+
- **L2 next.** `git fetch` + `HEAD..origin/main` → the merge exists. `git
|
|
117
|
+
worktree list` → the CI fix is stranded on an unpushed branch.
|
|
118
|
+
- **L1 last.** Read the merged route. It 307-redirects when `episode.audioUrl`
|
|
119
|
+
is set and falls back otherwise. Now the L4 observation is *explained*:
|
|
120
|
+
today's row predates the deploy, so it has no blob URL.
|
|
121
|
+
|
|
122
|
+
Reading the route first would have produced "seeking works now," which is false.
|
|
123
|
+
The L4 observation is what made the L1 reading mean anything.
|
|
124
|
+
|
|
125
|
+
## The pause trigger
|
|
126
|
+
|
|
127
|
+
These words may not be written until step 1–3 has run:
|
|
128
|
+
|
|
129
|
+
> is · is not · there is no · does not exist · never · only · nothing ·
|
|
130
|
+
> no code · zero · settled · confirmed · verified · impossible · cannot ·
|
|
131
|
+
> already · still
|
|
132
|
+
|
|
133
|
+
Seeing one in a draft sentence is a full stop. Answer out loud: *which layer,
|
|
134
|
+
and what instrument reached it?* If you cannot name both, you do not have the
|
|
135
|
+
claim yet.
|
|
136
|
+
|
|
137
|
+
## Absence claims need a layer, always
|
|
138
|
+
|
|
139
|
+
"X does not exist" is the single highest-risk shape, because a null result looks
|
|
140
|
+
identical at every layer. `grep` returning nothing and the thing genuinely not
|
|
141
|
+
existing are indistinguishable from inside L1.
|
|
142
|
+
|
|
143
|
+
Every absence claim ships with its scope written into the sentence: *what was
|
|
144
|
+
searched, at which layer, at what commit or time.* An absence claim with no
|
|
145
|
+
scope is not a weak claim. It is not a claim.
|
|
146
|
+
|
|
147
|
+
## Escape hatches
|
|
148
|
+
|
|
149
|
+
- **The higher layer is unreachable** (no credentials, no network, the service
|
|
150
|
+
is down): say so, state the claim at the layer you reached, and name the exact
|
|
151
|
+
command that would close it. Never silently downgrade and speak at full
|
|
152
|
+
confidence.
|
|
153
|
+
- **The user asserts a higher-layer fact that contradicts your lower-layer
|
|
154
|
+
check** ("there was a migration earlier today"): they are almost certainly
|
|
155
|
+
right, because they can see layers you did not check. Go check L2 and L3
|
|
156
|
+
before responding. Do not defend the L1 finding.
|
|
157
|
+
- **A record or prior session says SETTLED.** That is a claim to re-verify, not a
|
|
158
|
+
fact to inherit — and re-verify it at the layer it is asserted about. See
|
|
159
|
+
`feedback_reverify_relayed_citations_before_acting`.
|
|
160
|
+
|
|
161
|
+
## Relationship to the existing gates
|
|
162
|
+
|
|
163
|
+
This does not replace them. It adds the missing axis.
|
|
164
|
+
|
|
165
|
+
- `report_lint.py` `mechanism-claim-unobserved` grades **strength and
|
|
166
|
+
provenance**: did you name an instrument, and is it `[measured]` /
|
|
167
|
+
`[correlated]` / `[reasoned]`. It accepts `grep` and cannot tell that a grep
|
|
168
|
+
is blind to L2/L3. `claim_scope_lint.py` grades **reach**, and is the reason
|
|
169
|
+
the 2026-09-04 sentence would now be caught.
|
|
170
|
+
- `runtime-parity-verification` asserts rendered UI == backing store for a flow
|
|
171
|
+
you just changed. Same instinct, narrower scope: it fires on shipping work.
|
|
172
|
+
`claim-scope` fires on *saying things*, including in pure analysis with no
|
|
173
|
+
diff.
|
|
174
|
+
- `verification_claim_probe.py` re-executes a relayed claim's literal command.
|
|
175
|
+
Use it when the claim came from a subagent; use `claim-scope` on your own.
|
|
176
|
+
|
|
177
|
+
## Self-check before emitting
|
|
178
|
+
|
|
179
|
+
Before any report, answer these three. If any answer is missing, the report is
|
|
180
|
+
not ready.
|
|
181
|
+
|
|
182
|
+
1. For every factual claim: which layer, and which instrument reached it?
|
|
183
|
+
2. For every L3/L4 claim: what time was it observed, and has anything in this
|
|
184
|
+
session changed since?
|
|
185
|
+
3. For every absence claim: what exactly was searched, and at which layer?
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: color-engine
|
|
3
|
+
description: Generate accessible color systems and solve contrast, instead of guessing hex values. Use when picking or fixing colors for any UI, chart, diagram, doc, or artifact — "what colors should this use", "is this readable", "this text fails contrast", "make a dark theme", "pick an accent". Also use before shipping any palette, to PROVE contrast rather than assert it. NOT for choosing layout, typography, or component structure.
|
|
4
|
+
user-invocable: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Color Engine
|
|
8
|
+
|
|
9
|
+
Colors are **outputs**. The design is the set of **relationships** — contrast
|
|
10
|
+
targets, chroma structure, harmony geometry. Fix the relationships and rotate
|
|
11
|
+
the anchor hue and you get an infinite family of distinct-but-equally-valid
|
|
12
|
+
systems, because the design lives in what stays invariant.
|
|
13
|
+
|
|
14
|
+
Practical consequence: **never hand-pick hex values and hope.** State the
|
|
15
|
+
relationship you want; let the engine solve for the color that satisfies it.
|
|
16
|
+
|
|
17
|
+
## When to reach for this
|
|
18
|
+
|
|
19
|
+
- Choosing colors for a UI, chart, artifact, deck, or diagram.
|
|
20
|
+
- Any "is this readable / does this pass contrast" question.
|
|
21
|
+
- A design review where a palette needs to be *proven* accessible.
|
|
22
|
+
- Building a dark theme, or checking that an existing one survives dark mode.
|
|
23
|
+
|
|
24
|
+
Skip it when the project already has a committed design system — apply that
|
|
25
|
+
system instead. Its tokens win; use this only to fill gaps or verify.
|
|
26
|
+
|
|
27
|
+
## The three calls
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
from color_engine import palette, check, fix
|
|
31
|
+
|
|
32
|
+
# 1. Give me a valid color system.
|
|
33
|
+
p = palette(hue=250, profile="aurora-deep")
|
|
34
|
+
p["roles"] # {surface, on_surface, muted, accent, on_accent} — all contrast-solved
|
|
35
|
+
p["ramps"] # tonal ramps for surfaces/borders
|
|
36
|
+
|
|
37
|
+
# 2. Is this pair readable?
|
|
38
|
+
check("#6d7379", "#f6fbff") # -> ratio 4.6, passes True
|
|
39
|
+
check("#888", "#fff", target=7.0) # AAA
|
|
40
|
+
|
|
41
|
+
# 3. Make this pair readable.
|
|
42
|
+
fix("#999999", "#ffffff") # -> "#777676", 2.85 -> 4.53
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`fix` moves **lightness only**, preserving hue and chroma, so the result still
|
|
46
|
+
reads as the same color rather than being swapped for a different one. An
|
|
47
|
+
already-passing pair is returned unchanged — it never churns a color that was
|
|
48
|
+
fine. Check `passes_after`: an extreme target on a clipped gamut can still fall
|
|
49
|
+
short, and the engine reports that instead of hiding it.
|
|
50
|
+
|
|
51
|
+
## Customization — profiles, not forks
|
|
52
|
+
|
|
53
|
+
A profile is a named set of **relationship defaults**, not a set of colors.
|
|
54
|
+
Register your house style once; callers then ask by intent and get on-brand
|
|
55
|
+
results. Adding a profile never forks the engine.
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
from color_engine import register_profile
|
|
59
|
+
register_profile("my-app", {
|
|
60
|
+
"surface_L": 0.13, # dark ground
|
|
61
|
+
"accent_chroma": 0.17, # vivid accent
|
|
62
|
+
"on_surface_contrast": 13.0,
|
|
63
|
+
"muted_contrast": 4.6, # keep metadata legible, not invisible
|
|
64
|
+
})
|
|
65
|
+
palette(hue=210, profile="my-app")
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Built in: `default` · `aurora-deep` (dark glass) · `reading` (long-form, softer
|
|
69
|
+
than max contrast because 21:1 is harsh over minutes) · `wcag-aaa`.
|
|
70
|
+
|
|
71
|
+
Harmony geometry: `complementary` · `analogous` · `triadic` · `split`.
|
|
72
|
+
|
|
73
|
+
## Contrast targets
|
|
74
|
+
|
|
75
|
+
| Target | Use |
|
|
76
|
+
|---|---|
|
|
77
|
+
| 3.0 | Large text, UI boundaries, icons |
|
|
78
|
+
| 4.5 | Body text (WCAG AA) — the default |
|
|
79
|
+
| 7.0 | AAA body text |
|
|
80
|
+
|
|
81
|
+
Deliberately reduce contrast for metadata and disabled states to build
|
|
82
|
+
hierarchy, but keep it **above 3.0** so it reads as de-emphasized rather than
|
|
83
|
+
broken. Dark mode needs its own audit: a pair that passes on white can fail on
|
|
84
|
+
near-black.
|
|
85
|
+
|
|
86
|
+
## Installing in another project
|
|
87
|
+
|
|
88
|
+
Copy this directory. It is **pure stdlib with zero dependencies** — no install
|
|
89
|
+
step, no lockfile, no version conflict. `_core.py` is vendored from
|
|
90
|
+
`groundwork/designer/color/relationships.py` and carries a `source_sha256`
|
|
91
|
+
header; re-hash the source to detect drift. Do not hand-edit `_core.py` —
|
|
92
|
+
extend through `color_engine.py` or a profile.
|
|
93
|
+
|
|
94
|
+
Verify after copying:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
python3 -c "import _core; _core._selftest()" # math anchors + invariance
|
|
98
|
+
python3 color_engine.py # the three calls
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The self-test checks the property that matters: hue-rotated palettes hold every
|
|
102
|
+
contrast target in **both** light and dark, so the generator spans the space
|
|
103
|
+
instead of enumerating points in it.
|