@tyroneross/build-loop 0.30.3
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 +10 -0
- package/.claude-plugin/marketplace.json +38 -0
- package/.claude-plugin/plugin.json +30 -0
- package/.codex-plugin/plugin.json +41 -0
- package/.cursor/rules/build-loop-surface.mdc +22 -0
- package/AGENTS.md +498 -0
- package/LICENSE +202 -0
- package/README.md +403 -0
- package/agents/alignment-checker.md +124 -0
- package/agents/api-assessor.md +136 -0
- package/agents/architecture-scout.md +185 -0
- package/agents/assessment-orchestrator.md +163 -0
- package/agents/build-orchestrator.md +198 -0
- package/agents/database-assessor.md +133 -0
- package/agents/design-contract-specialist.md +239 -0
- package/agents/fact-checker.md +69 -0
- package/agents/fix-critique.md +161 -0
- package/agents/frontend-assessor.md +136 -0
- package/agents/implementer.md +185 -0
- package/agents/independent-auditor.md +143 -0
- package/agents/mock-scanner.md +78 -0
- package/agents/optimize-runner.md +112 -0
- package/agents/overfitting-reviewer.md +96 -0
- package/agents/performance-assessor.md +159 -0
- package/agents/plan-critic.md +85 -0
- package/agents/promotion-reviewer.md +121 -0
- package/agents/recurring-pattern-detector.md +248 -0
- package/agents/retrospective-synthesizer.md +109 -0
- package/agents/root-cause-investigator.md +285 -0
- package/agents/scope-auditor.md +121 -0
- package/agents/security-reviewer.md +151 -0
- package/agents/self-improvement-architect.md +125 -0
- package/agents/synthesis-critic.md +99 -0
- package/agents/transcript-pattern-miner.md +165 -0
- package/agents/ui-validator.md +193 -0
- package/codex-skills/build-loop/SKILL.md +20 -0
- package/codex-skills/debug-loop/SKILL.md +18 -0
- package/codex-skills/handoff/SKILL.md +22 -0
- package/codex-skills/knowledge/SKILL.md +21 -0
- package/codex-skills/optimize/SKILL.md +18 -0
- package/codex-skills/research/SKILL.md +18 -0
- package/commands/agent-rally-point.md +301 -0
- package/commands/assess.md +41 -0
- package/commands/debug.md +20 -0
- package/commands/debugger-detail.md +34 -0
- package/commands/debugger-scan.md +15 -0
- package/commands/debugger-status.md +20 -0
- package/commands/debugger.md +32 -0
- package/commands/handoff.md +113 -0
- package/commands/knowledge-review.md +16 -0
- package/commands/optimize.md +31 -0
- package/commands/plan-verify.md +39 -0
- package/commands/promote-experiment.md +129 -0
- package/commands/research.md +22 -0
- package/commands/run.md +12 -0
- package/commands/self-review.md +51 -0
- package/commands/start-prd.md +57 -0
- package/commands/test.md +34 -0
- package/dist/src/assessment-orchestrator.d.ts +78 -0
- package/dist/src/assessment-orchestrator.d.ts.map +1 -0
- package/dist/src/assessment-orchestrator.js +304 -0
- package/dist/src/assessment-orchestrator.js.map +1 -0
- package/dist/src/audit-miner.d.ts +21 -0
- package/dist/src/audit-miner.d.ts.map +1 -0
- package/dist/src/audit-miner.js +421 -0
- package/dist/src/audit-miner.js.map +1 -0
- package/dist/src/batch-operations.d.ts +30 -0
- package/dist/src/batch-operations.d.ts.map +1 -0
- package/dist/src/batch-operations.js +339 -0
- package/dist/src/batch-operations.js.map +1 -0
- package/dist/src/config.d.ts +83 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +176 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context-engine.d.ts +45 -0
- package/dist/src/context-engine.d.ts.map +1 -0
- package/dist/src/context-engine.js +135 -0
- package/dist/src/context-engine.js.map +1 -0
- package/dist/src/debug-wrapper.d.ts +58 -0
- package/dist/src/debug-wrapper.d.ts.map +1 -0
- package/dist/src/debug-wrapper.js +285 -0
- package/dist/src/debug-wrapper.js.map +1 -0
- package/dist/src/index.d.ts +31 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +149 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interactive-verifier.d.ts +26 -0
- package/dist/src/interactive-verifier.d.ts.map +1 -0
- package/dist/src/interactive-verifier.js +435 -0
- package/dist/src/interactive-verifier.js.map +1 -0
- package/dist/src/lessons.d.ts +59 -0
- package/dist/src/lessons.d.ts.map +1 -0
- package/dist/src/lessons.js +172 -0
- package/dist/src/lessons.js.map +1 -0
- package/dist/src/log-reader.d.ts +39 -0
- package/dist/src/log-reader.d.ts.map +1 -0
- package/dist/src/log-reader.js +291 -0
- package/dist/src/log-reader.js.map +1 -0
- package/dist/src/logger.d.ts +59 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +328 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/parallel-retrieval.d.ts +52 -0
- package/dist/src/parallel-retrieval.d.ts.map +1 -0
- package/dist/src/parallel-retrieval.js +309 -0
- package/dist/src/parallel-retrieval.js.map +1 -0
- package/dist/src/pattern-extractor.d.ts +30 -0
- package/dist/src/pattern-extractor.d.ts.map +1 -0
- package/dist/src/pattern-extractor.js +386 -0
- package/dist/src/pattern-extractor.js.map +1 -0
- package/dist/src/result-aggregator.d.ts +44 -0
- package/dist/src/result-aggregator.d.ts.map +1 -0
- package/dist/src/result-aggregator.js +315 -0
- package/dist/src/result-aggregator.js.map +1 -0
- package/dist/src/retrieval.d.ts +139 -0
- package/dist/src/retrieval.d.ts.map +1 -0
- package/dist/src/retrieval.js +724 -0
- package/dist/src/retrieval.js.map +1 -0
- package/dist/src/setup/auto-setup.d.ts +15 -0
- package/dist/src/setup/auto-setup.d.ts.map +1 -0
- package/dist/src/setup/auto-setup.js +157 -0
- package/dist/src/setup/auto-setup.js.map +1 -0
- package/dist/src/setup/configure-hooks.d.ts +8 -0
- package/dist/src/setup/configure-hooks.d.ts.map +1 -0
- package/dist/src/setup/configure-hooks.js +16 -0
- package/dist/src/setup/configure-hooks.js.map +1 -0
- package/dist/src/setup/create-slash-commands.d.ts +8 -0
- package/dist/src/setup/create-slash-commands.d.ts.map +1 -0
- package/dist/src/setup/create-slash-commands.js +101 -0
- package/dist/src/setup/create-slash-commands.js.map +1 -0
- package/dist/src/setup/index.d.ts +8 -0
- package/dist/src/setup/index.d.ts.map +1 -0
- package/dist/src/setup/index.js +17 -0
- package/dist/src/setup/index.js.map +1 -0
- package/dist/src/setup/inject-claude-md.d.ts +10 -0
- package/dist/src/setup/inject-claude-md.d.ts.map +1 -0
- package/dist/src/setup/inject-claude-md.js +150 -0
- package/dist/src/setup/inject-claude-md.js.map +1 -0
- package/dist/src/setup/uninstall.d.ts +22 -0
- package/dist/src/setup/uninstall.d.ts.map +1 -0
- package/dist/src/setup/uninstall.js +235 -0
- package/dist/src/setup/uninstall.js.map +1 -0
- package/dist/src/storage.d.ts +192 -0
- package/dist/src/storage.d.ts.map +1 -0
- package/dist/src/storage.js +1037 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/string-similarity.d.ts +8 -0
- package/dist/src/string-similarity.d.ts.map +1 -0
- package/dist/src/string-similarity.js +57 -0
- package/dist/src/string-similarity.js.map +1 -0
- package/dist/src/traces/adapters/browser.d.ts +69 -0
- package/dist/src/traces/adapters/browser.d.ts.map +1 -0
- package/dist/src/traces/adapters/browser.js +280 -0
- package/dist/src/traces/adapters/browser.js.map +1 -0
- package/dist/src/traces/adapters/index.d.ts +23 -0
- package/dist/src/traces/adapters/index.d.ts.map +1 -0
- package/dist/src/traces/adapters/index.js +67 -0
- package/dist/src/traces/adapters/index.js.map +1 -0
- package/dist/src/traces/adapters/langchain.d.ts +42 -0
- package/dist/src/traces/adapters/langchain.d.ts.map +1 -0
- package/dist/src/traces/adapters/langchain.js +151 -0
- package/dist/src/traces/adapters/langchain.js.map +1 -0
- package/dist/src/traces/adapters/opentelemetry.d.ts +46 -0
- package/dist/src/traces/adapters/opentelemetry.d.ts.map +1 -0
- package/dist/src/traces/adapters/opentelemetry.js +164 -0
- package/dist/src/traces/adapters/opentelemetry.js.map +1 -0
- package/dist/src/traces/adapters/sentry.d.ts +58 -0
- package/dist/src/traces/adapters/sentry.d.ts.map +1 -0
- package/dist/src/traces/adapters/sentry.js +212 -0
- package/dist/src/traces/adapters/sentry.js.map +1 -0
- package/dist/src/traces/index.d.ts +10 -0
- package/dist/src/traces/index.d.ts.map +1 -0
- package/dist/src/traces/index.js +45 -0
- package/dist/src/traces/index.js.map +1 -0
- package/dist/src/traces/storage.d.ts +78 -0
- package/dist/src/traces/storage.d.ts.map +1 -0
- package/dist/src/traces/storage.js +399 -0
- package/dist/src/traces/storage.js.map +1 -0
- package/dist/src/traces/summarizer.d.ts +83 -0
- package/dist/src/traces/summarizer.d.ts.map +1 -0
- package/dist/src/traces/summarizer.js +247 -0
- package/dist/src/traces/summarizer.js.map +1 -0
- package/dist/src/traces/types.d.ts +365 -0
- package/dist/src/traces/types.d.ts.map +1 -0
- package/dist/src/traces/types.js +14 -0
- package/dist/src/traces/types.js.map +1 -0
- package/dist/src/types.d.ts +495 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +27 -0
- package/dist/src/types.js.map +1 -0
- package/docs/agent-surface-policy.md +45 -0
- package/docs/memory-setup.md +226 -0
- package/hooks/_arch_scan_bg.py +88 -0
- package/hooks/_plugin_drift_check_bg.py +85 -0
- package/hooks/_session_start_lib.sh +42 -0
- package/hooks/git/pre-push +141 -0
- package/hooks/hooks.json +126 -0
- package/hooks/post-commit +30 -0
- package/hooks/pre-commit +29 -0
- package/hooks/pre-edit-apppulse.sh +6 -0
- package/hooks/pre-edit-architecture.sh +106 -0
- package/hooks/pre-edit-rally-point.sh +92 -0
- package/hooks/session-start-apppulse.sh +6 -0
- package/hooks/session-start-architecture.sh +10 -0
- package/hooks/session-start-git-hooks.sh +12 -0
- package/hooks/session-start-plugin-drift.sh +27 -0
- package/hooks/session-start-rally-point.sh +44 -0
- package/hooks/session-start-retrieval.sh +24 -0
- package/hooks/session-start-worktree-gc.sh +105 -0
- package/hooks/test_apppulse_hooks.sh +6 -0
- package/hooks/test_rally_point_hooks.sh +388 -0
- package/hooks/test_sec008_hooks.sh +66 -0
- package/package.json +111 -0
- package/scripts/README.md +301 -0
- package/scripts/_db_url.py +61 -0
- package/scripts/_paths.py +445 -0
- package/scripts/blm.py +162 -0
- package/scripts/blm_api.py +263 -0
- package/scripts/check_cache_sync.py +490 -0
- package/scripts/embed_backend.py +475 -0
- package/scripts/install_memory.py +556 -0
- package/scripts/lessons_index/__init__.py +77 -0
- package/scripts/lessons_index/__main__.py +135 -0
- package/scripts/lessons_index/ingest.py +288 -0
- package/scripts/lessons_index/query.py +285 -0
- package/scripts/lessons_index/schema.py +114 -0
- package/scripts/memory_context/__init__.py +610 -0
- package/scripts/memory_graph/__init__.py +393 -0
- package/scripts/project_resolver.py +172 -0
- package/scripts/prune_codex_plugin_cache.py +23 -0
- package/scripts/prune_plugin_cache.py +359 -0
- package/scripts/semantic_index/__init__.py +482 -0
- package/scripts/semantic_index/_bench_hybrid.py +175 -0
- package/scripts/semantic_index/backfill.py +263 -0
- package/scripts/semantic_index/hybrid.py +174 -0
- package/scripts/semantic_index/test_backfill.py +292 -0
- package/scripts/semantic_index/test_hybrid.py +541 -0
- package/scripts/sync_navgator_lessons.py +666 -0
- package/scripts/sync_plugin_cache.py +388 -0
- package/skills/agent-rally-point/SKILL.md +165 -0
- package/skills/agent-rally-watcher/SKILL.md +83 -0
- package/skills/api-registry-bridge/SKILL.md +59 -0
- package/skills/architecture/dead/SKILL.md +56 -0
- package/skills/architecture/impact/SKILL.md +88 -0
- package/skills/architecture/review/SKILL.md +227 -0
- package/skills/architecture/rules/SKILL.md +72 -0
- package/skills/architecture/scan/SKILL.md +79 -0
- package/skills/architecture/trace/SKILL.md +65 -0
- package/skills/attribution-standard/SKILL.md +122 -0
- package/skills/authentication/SKILL.md +81 -0
- package/skills/authentication/references/better-auth-magic-link.md +135 -0
- package/skills/authentication/references/better-auth-setup.md +224 -0
- package/skills/authentication/references/google-calendar-sync.md +278 -0
- package/skills/authentication/references/google-cloud-console.md +159 -0
- package/skills/authentication/references/google-geocoding-directions.md +126 -0
- package/skills/authentication/references/google-lessons-example-web-app.md +177 -0
- package/skills/authentication/references/google-maps.md +162 -0
- package/skills/authentication/references/google-oauth-setup.md +343 -0
- package/skills/authentication/references/google-places.md +173 -0
- package/skills/authentication/references/lessons-example-web-app-better-auth.md +126 -0
- package/skills/authentication/references/resend-email.md +227 -0
- package/skills/authentication/references/resend-otp-magic-link.md +153 -0
- package/skills/authentication/references/supabase-auth.md +172 -0
- package/skills/auto-decision-capture/SKILL.md +419 -0
- package/skills/build-loop/SKILL.md +516 -0
- package/skills/build-loop/detect-plugins.mjs +82 -0
- package/skills/build-loop/eval-guide.md +65 -0
- package/skills/build-loop/fallbacks.md +549 -0
- package/skills/build-loop/phases/fact-check.md +42 -0
- package/skills/build-loop/phases/ui-validation.md +267 -0
- package/skills/build-loop/references/apple-native-planning.md +439 -0
- package/skills/build-loop/references/capability-routing.md +181 -0
- package/skills/build-loop/references/codex-subagents.md +98 -0
- package/skills/build-loop/references/coordination.md +161 -0
- package/skills/build-loop/references/correction-aware-capture.md +177 -0
- package/skills/build-loop/references/independent-auditor.md +72 -0
- package/skills/build-loop/references/intent-capability-pack.md +170 -0
- package/skills/build-loop/references/intent-exploration-prompts.md +96 -0
- package/skills/build-loop/references/leadership.md +72 -0
- package/skills/build-loop/references/memory.md +284 -0
- package/skills/build-loop/references/modular-systems-pack.md +96 -0
- package/skills/build-loop/references/output-style.md +129 -0
- package/skills/build-loop/references/pay-it-forward-arch.md +98 -0
- package/skills/build-loop/references/phase-1-assess.md +218 -0
- package/skills/build-loop/references/phase-2-plan.md +77 -0
- package/skills/build-loop/references/phase-3-execute.md +47 -0
- package/skills/build-loop/references/phase-4-review.md +310 -0
- package/skills/build-loop/references/phase-5-iterate.md +71 -0
- package/skills/build-loop/references/phase-6-learn.md +56 -0
- package/skills/build-loop/references/recent-design-structures.md +274 -0
- package/skills/build-loop/references/refactor-history/ASSESSMENT.md +85 -0
- package/skills/build-loop/references/refactor-history/STANDALONE_TEST_RUN.md +149 -0
- package/skills/build-loop/references/refactor-history/scenarios/01-simple-bugfix.md +32 -0
- package/skills/build-loop/references/refactor-history/scenarios/02-ui-build-with-iteration.md +48 -0
- package/skills/build-loop/references/refactor-history/scenarios/03-multi-failure-escalation.md +60 -0
- package/skills/build-loop/references/refactor-history/scenarios/04-ui-build-ibr-absent.md +51 -0
- package/skills/build-loop/references/refactor-history/scenarios/05-refactor-navgator-absent.md +71 -0
- package/skills/build-loop/references/refactor-history/scenarios/06-recurring-bug-debugger-absent.md +52 -0
- package/skills/build-loop/references/refactor-history/trace-comparison.md +202 -0
- package/skills/build-loop/references/self-recursive-dev.md +77 -0
- package/skills/build-loop/references/self-review.md +232 -0
- package/skills/build-loop/references/ui-io-contract.md +116 -0
- package/skills/build-loop/scanners/audit-design-rules.mjs +476 -0
- package/skills/build-loop/scanners/require-visual-evidence.mjs +239 -0
- package/skills/build-loop/templates/backlog-item.md +35 -0
- package/skills/build-loop/templates/codex-worker-prompt.md +89 -0
- package/skills/build-loop/templates/ui-subagent-prompt.md +179 -0
- package/skills/build-loop/templates/ux-fix-plan.md +40 -0
- package/skills/building-with-deepagents/SKILL.md +195 -0
- package/skills/building-with-deepagents/references/anti-patterns.md +141 -0
- package/skills/building-with-deepagents/references/api-quick-reference.md +184 -0
- package/skills/capabilities/SKILL.md +91 -0
- package/skills/debug-loop/SKILL.md +278 -0
- package/skills/debug-loop/references/convergence-rules.md +145 -0
- package/skills/debug-loop/references/swiftui-macos-clunky-ui-debugger.html +823 -0
- package/skills/debugging/assess/SKILL.md +111 -0
- package/skills/debugging/debug-loop/SKILL.md +231 -0
- package/skills/debugging/memory/SKILL.md +147 -0
- package/skills/debugging/store/SKILL.md +153 -0
- package/skills/debugging-memory/SKILL.md +440 -0
- package/skills/debugging-memory/examples/incident-example.json +67 -0
- package/skills/debugging-memory/references/incident-documentation.md +280 -0
- package/skills/debugging-memory/references/ios-notification-alarm-playbook.md +300 -0
- package/skills/debugging-memory/references/pattern-extraction.md +163 -0
- package/skills/debugging-memory/references/subagent-integration.md +312 -0
- package/skills/defenseclaw-bridge/SKILL.md +156 -0
- package/skills/defenseclaw-bridge/references/dc-config-mapping.md +162 -0
- package/skills/defenseclaw-bridge/references/output-format.md +108 -0
- package/skills/handoff/SKILL.md +94 -0
- package/skills/ibr-bridge/SKILL.md +68 -0
- package/skills/knowledge/SKILL.md +127 -0
- package/skills/knowledge/references/recall-integration.md +83 -0
- package/skills/knowledge/templates/madr-minimal.md +56 -0
- package/skills/knowledge-review/SKILL.md +112 -0
- package/skills/logging-tracer/SKILL.md +202 -0
- package/skills/logging-tracer/references/log-analysis.md +128 -0
- package/skills/logging-tracer/references/stack-templates.md +274 -0
- package/skills/logging-tracer-bridge/SKILL.md +70 -0
- package/skills/mcp-builder/SKILL.md +278 -0
- package/skills/mcp-builder/references/mcp-security.md +106 -0
- package/skills/model-tiering/SKILL.md +216 -0
- package/skills/native-ax-driver/SKILL.md +220 -0
- package/skills/native-ax-driver/scripts/layout_fill.py +222 -0
- package/skills/native-ax-driver/scripts/native_driver.py +495 -0
- package/skills/native-ax-driver/swift/bl-ax-driver/Package.swift +20 -0
- package/skills/native-ax-driver/swift/bl-ax-driver/Sources/main.swift +542 -0
- package/skills/optimize/SKILL.md +202 -0
- package/skills/optimize/profiles.md +61 -0
- package/skills/plan-verify/SKILL.md +115 -0
- package/skills/plan-verify/test-fixtures/example-app-v20-findings.json +27 -0
- package/skills/plan-verify/test-fixtures/example-app-v20.md +42 -0
- package/skills/plan-verify/test-fixtures/example-app-v22-findings.json +15 -0
- package/skills/plan-verify/test-fixtures/example-app-v22.md +1608 -0
- package/skills/plan-verify/test-fixtures/unrelated-good-plan-findings.json +15 -0
- package/skills/plan-verify/test-fixtures/unrelated-good-plan.md +55 -0
- package/skills/plugin-builder/SKILL.md +329 -0
- package/skills/plugin-builder/references/authoritative-sources.md +104 -0
- package/skills/plugin-builder/references/build-loop-phase-guidance.md +94 -0
- package/skills/plugin-builder/references/components-guide.md +221 -0
- package/skills/plugin-builder/references/distribution.md +317 -0
- package/skills/plugin-builder/references/dual-host-claude-codex.md +220 -0
- package/skills/plugin-builder/references/hooks-reference.md +210 -0
- package/skills/plugin-builder/references/manifest-schema.md +111 -0
- package/skills/plugin-builder/references/plugin-hygiene-lessons.md +307 -0
- package/skills/plugin-tests/SKILL.md +94 -0
- package/skills/prd-bridge/SKILL.md +135 -0
- package/skills/research/SKILL.md +80 -0
- package/skills/security-methodology/SKILL.md +105 -0
- package/skills/security-methodology/references/cross-source-matrix.md +77 -0
- package/skills/security-methodology/references/mitre-atlas-starter.md +83 -0
- package/skills/security-methodology/references/nist-600-1-mapping.md +119 -0
- package/skills/security-methodology/references/owasp-agentic-top-10.md +157 -0
- package/skills/security-methodology/references/owasp-llm-top-10.md +144 -0
- package/skills/security-methodology/references/owasp-web-top-10.md +65 -0
- package/skills/self-improve/SKILL.md +298 -0
- package/skills/spec-writing/SKILL.md +548 -0
- package/skills/spec-writing/scripts/check_checklist.py +478 -0
- package/skills/sync-skills/SKILL.md +132 -0
- package/skills/telemetry/SKILL.md +66 -0
- package/skills/ui-design/SKILL.md +75 -0
- package/skills/ui-design/references/design-patterns-multi.md +165 -0
- package/skills/ui-design/references/design-preferences-from-owned-apps.md +150 -0
- package/skills/ui-design/references/evidence-capture-policy.md +55 -0
- package/skills/ui-design/references/ui-guidance-sources.md +330 -0
- package/skills/ui-design/references/universal-design-principles.alt.md +182 -0
- package/skills/ui-design/references/universal-design-principles.md +419 -0
- package/templates/memory/MEMORY.md.template +55 -0
- package/templates/memory/constitution.md.template +64 -0
- package/templates/memory/manifest.json +47 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
<!-- SPDX-FileCopyrightText: 2025-2026 Tyrone Ross, Jr <46267523+tyroneross@users.noreply.github.com> | SPDX-License-Identifier: Apache-2.0 -->
|
|
2
|
+
|
|
3
|
+
# Self-Review — Periodic Autonomous Self-Improvement
|
|
4
|
+
|
|
5
|
+
Single source of truth for the build-loop self-review subsystem: purpose, light/deep model, config schema, launchd schedule, graceful degradation, and the headless apply prompt.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Purpose
|
|
10
|
+
|
|
11
|
+
Self-review mines recent build-loop runs for recurring issues and efficiency signals, produces a human-readable digest, and (in deep mode) automatically applies safe improvements via the normal build-loop pipeline. It closes the loop between observations captured during builds and durable fixes that land in the repo — without requiring the user to manually schedule or trigger a review.
|
|
12
|
+
|
|
13
|
+
Two cadences balance cost against coverage:
|
|
14
|
+
|
|
15
|
+
| Mode | Default cadence | Scope | Auto-apply |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| **light** | Daily (09:00) | Issues in the last 7 days; proposal cap 10 | No — digest + queue only |
|
|
18
|
+
| **deep** | Weekly (Sunday 03:00) | Issues in the last 30 days; uncapped | Yes — SAFE proposals auto-routed through build-loop |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Config schema
|
|
23
|
+
|
|
24
|
+
Add a `selfReview` block to `.build-loop/config.json` (all fields optional; defaults shown):
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"selfReview": {
|
|
29
|
+
"enabled": true,
|
|
30
|
+
"autonomy": "apply_push",
|
|
31
|
+
"light": "daily",
|
|
32
|
+
"deep": "weekly"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Field | Values | Meaning |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| `enabled` | `true` / `false` | `false` disables the launchd jobs and is a no-op for the installer |
|
|
40
|
+
| `autonomy` | `apply_push` \| `apply_local` \| `propose` | `apply_push` — apply SAFE items and push main; `apply_local` — apply but do not push; `propose` — queue only, no auto-apply |
|
|
41
|
+
| `light` | `daily` \| `weekly` \| `disabled` | Cadence for the light job |
|
|
42
|
+
| `deep` | `daily` \| `weekly` \| `disabled` | Cadence for the deep job |
|
|
43
|
+
|
|
44
|
+
Cadence values map to launchd `StartCalendarInterval`. `daily` → every day at the job's configured hour. `weekly` → once per week on the configured weekday. `disabled` skips installing that job.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## How it works
|
|
49
|
+
|
|
50
|
+
### Data-gathering layer (scripts/self_review/ package — frozen CLI)
|
|
51
|
+
|
|
52
|
+
`python3 scripts/self_review/__main__.py --mode {light|deep} [--workdir <repo>] [--days N] [--dry-run] --json`
|
|
53
|
+
|
|
54
|
+
Always exits 0. Writes:
|
|
55
|
+
- `.build-loop/self-review/<UTCdate>-<mode>.md` — human digest
|
|
56
|
+
- `.build-loop/proposals/self-review-*.md` — one file per candidate improvement, each with `classify_hint: SAFE|RISKY|DECISION` frontmatter
|
|
57
|
+
|
|
58
|
+
Returns JSON to stdout:
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"mode": "light|deep",
|
|
62
|
+
"window_days": 7,
|
|
63
|
+
"mined": {"corrections": [], "rituals": [], "sequences": []},
|
|
64
|
+
"efficiency_findings": [],
|
|
65
|
+
"self_simplification": [],
|
|
66
|
+
"digest_path": ".build-loop/self-review/2026-05-29-deep.md",
|
|
67
|
+
"queued": [".build-loop/proposals/self-review-foo.md"],
|
|
68
|
+
"errors": [],
|
|
69
|
+
"dry_run": false
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**`self_simplification[]`** (deep mode, self-recursive only): a list of proactive simplification findings for build-loop's own code. Each entry has the shape:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"target": "self",
|
|
78
|
+
"file": "<relative path>",
|
|
79
|
+
"finding": "<one-line description>",
|
|
80
|
+
"classify_hint": "SAFE|RISKY|DECISION",
|
|
81
|
+
"proposed_action": "<what to do>"
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`target: self` marks a proposal as targeting build-loop's own code (plugin repo or `build-loop-memory`). These proposals are subject to the SELF-MODIFICATION SAFETY GATE (see §"Self-modification of the restricted repo" below) — they are never processed by the standard reactive-fix path.
|
|
86
|
+
|
|
87
|
+
Deep mode digests include an `## Apply plan` section that separates SAFE-to-auto-apply items from RISKY-to-surface items. When `self_simplification[]` is non-empty, the digest also includes a `## Self-simplification proposals` section listing each `target: self` finding.
|
|
88
|
+
|
|
89
|
+
### Scheduling layer (launchd)
|
|
90
|
+
|
|
91
|
+
`python3 scripts/install_self_review.py install` writes two plists to `~/Library/LaunchAgents/`:
|
|
92
|
+
|
|
93
|
+
- `com.tyroneross.buildloop.selfreview-light.plist` — daily at 09:00, invokes `scripts/self_review_run.sh light`
|
|
94
|
+
- `com.tyroneross.buildloop.selfreview-deep.plist` — weekly Sunday at 03:00, invokes `scripts/self_review_run.sh deep`
|
|
95
|
+
|
|
96
|
+
Both jobs write output to `.build-loop/self-review/launchd-{light,deep}.log`.
|
|
97
|
+
|
|
98
|
+
### Wrapper layer (scripts/self_review_run.sh)
|
|
99
|
+
|
|
100
|
+
Invoked by launchd (or manually). Runs the gatherer, saves the JSON snapshot to `.build-loop/self-review/last-<mode>.json`, appends a timestamped line to `.build-loop/self-review/run.log`, and (for deep mode with `autonomy` in `{apply_push, apply_local}`) invokes the headless apply prompt via `claude -p`.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Install / uninstall / status
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# Install both launchd jobs
|
|
108
|
+
python3 scripts/install_self_review.py install
|
|
109
|
+
|
|
110
|
+
# Remove launchd jobs and plists
|
|
111
|
+
python3 scripts/install_self_review.py uninstall
|
|
112
|
+
|
|
113
|
+
# Check loaded/not-loaded
|
|
114
|
+
python3 scripts/install_self_review.py status
|
|
115
|
+
|
|
116
|
+
# JSON output for any subcommand
|
|
117
|
+
python3 scripts/install_self_review.py status --json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Or via the slash command: `/build-loop:self-review --install` / `--uninstall` / `--status`.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Graceful degradation
|
|
125
|
+
|
|
126
|
+
If the `claude` CLI is not installed or not on PATH when the deep wrapper fires, the wrapper logs the skip reason and exits 0. The digest and queued proposals are still produced — the user can process them manually via `/build-loop:run` or `/build-loop:self-review deep`.
|
|
127
|
+
|
|
128
|
+
The queue accumulates across skipped deep runs. On the next successful headless invocation, all queued SAFE proposals are processed.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Self-modification of the restricted repo
|
|
135
|
+
|
|
136
|
+
The self-review/self-heal loop is authorized to write to the restricted repo — build-loop's own plugin repo and the `build-loop-memory` durable repo (lessons and skills). This is normally a guarded action because it edits the running runtime.
|
|
137
|
+
|
|
138
|
+
**The SELF-MODIFICATION SAFETY GATE is MANDATORY and non-negotiable for ANY change to build-loop's own code.** It is the load-bearing safety for this authorization.
|
|
139
|
+
|
|
140
|
+
### Gate protocol (every self-modification commit must pass all steps)
|
|
141
|
+
|
|
142
|
+
**Step 1 — Bundle first (reversibility):**
|
|
143
|
+
```bash
|
|
144
|
+
git bundle create .build-loop/bundles/pre-selfmod-$(date +%Y%m%dT%H%M%S).bundle --all
|
|
145
|
+
```
|
|
146
|
+
Always bundle before any self-modification. This is the rollback point.
|
|
147
|
+
|
|
148
|
+
**Step 2 — Self-recursive / per-commit mode:**
|
|
149
|
+
Self-modifications use the existing per-commit mode machinery (one commit at a time, reviewed before the next). `selfRecursive.enabled` is `true` when the working directory IS build-loop's own repo. Do not batch multiple self-modification commits without a gate pass between each.
|
|
150
|
+
|
|
151
|
+
**Step 3 — Verify gate (MANDATORY before commit):**
|
|
152
|
+
```bash
|
|
153
|
+
python3 scripts/self_mod_verify.py \
|
|
154
|
+
--workdir "$PWD" \
|
|
155
|
+
--scope auto \
|
|
156
|
+
--changed-files <space-separated file list> \
|
|
157
|
+
--auto-revert \
|
|
158
|
+
--json
|
|
159
|
+
```
|
|
160
|
+
`--scope auto` runs mapped tests for small changes and broader tests for multi-file/core changes (practical default). Use `--scope full` for the slow exhaustive option (900s, parallel when pytest-xdist is present).
|
|
161
|
+
|
|
162
|
+
`verdict: pass` → the self-modification may commit.
|
|
163
|
+
`verdict: fail` → the gate AUTO-REVERTS the change and writes the finding to `.build-loop/proposals/failed-gate/`. The change is NEVER committed. Do not retry a failed gate verdict without diagnosing the root cause.
|
|
164
|
+
|
|
165
|
+
**Self-modifications execute — they do not stop the loop.** A self-modification that is part of the accepted plan (including edits to the gate, tests, or the self-improvement loop) executes behind the test-suite gate: `self_mod_verify.py --scope auto --auto-revert` must return `verdict: pass` (tests are the oracle; a failed gate auto-reverts the change). Build-loop never halts a planned self-modification for human approval. Oversight is post-hoc, not a gate: (a) self-modifying runs trigger an ADDITIONAL adversarial review (independent-auditor at build scope; the periodic deep self-review re-audits recent self-modifications) — non-blocking; (b) the end-of-run readback reports every self-modification and the additional-review findings so the human sees results at the end. The loop stays on task and reports once, at the end.
|
|
166
|
+
|
|
167
|
+
**Step 4 — SAFE-only auto-apply:**
|
|
168
|
+
Only changes that `classify_action.py` classifies as SAFE auto-apply through this path. Structural or architectural self-modifications — new phase, changed dispatch contract, agent-role change — surface as DECISION and are never auto-applied. They are queued to `.build-loop/proposals/needs-decision/` for explicit user action.
|
|
169
|
+
|
|
170
|
+
### Authorized targets
|
|
171
|
+
|
|
172
|
+
- Build-loop's own plugin repo (files under the build-loop working directory when `selfRecursive.enabled`)
|
|
173
|
+
- `build-loop-memory` durable repo: lessons, skills, and project-scoped memory entries written via `scripts/memory_writer.py`
|
|
174
|
+
|
|
175
|
+
### What is NOT authorized without user confirmation
|
|
176
|
+
|
|
177
|
+
- Promotion of project-local skills to `~/.claude/skills/` (global scope — confirm first)
|
|
178
|
+
- Changes to `agents/build-orchestrator.md` phase contracts or MECE ownership rules (structural — DECISION; surface as DECISION, never auto-apply)
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## APPLY PROMPT
|
|
183
|
+
|
|
184
|
+
This is the exact prompt text fed to `claude -p` by `scripts/self_review_run.sh` for deep auto-apply. Do not paraphrase — the wrapper reads this file and extracts the block between the `BEGIN_APPLY_PROMPT` and `END_APPLY_PROMPT` markers.
|
|
185
|
+
|
|
186
|
+
<!-- BEGIN_APPLY_PROMPT -->
|
|
187
|
+
You are running headlessly as part of a scheduled build-loop self-review. Your job is to apply safe improvements identified by the periodic self-review.
|
|
188
|
+
|
|
189
|
+
Step 1 — Read the context:
|
|
190
|
+
- Read `.build-loop/self-review/last-deep.json` (the data-gatherer output).
|
|
191
|
+
- For each path listed in `queued[]`, read the proposal file. Take only proposals where `classify_hint: SAFE`.
|
|
192
|
+
- Skip any proposal where `classify_hint` is `RISKY` or `DECISION` — leave those files untouched.
|
|
193
|
+
- Separately, collect every entry in `self_simplification[]` where `classify_hint: SAFE` AND `target: self`. These are proactive self-simplifications of build-loop's own code and require the SELF-MODIFICATION SAFETY GATE in Step 2b.
|
|
194
|
+
|
|
195
|
+
Step 2a — Apply each SAFE non-self proposal:
|
|
196
|
+
For each SAFE proposal without `target: self`, route it through `/build-loop:run` with a goal derived from the proposal's title and body. Build-loop handles apply + commit + collapse. Its own autonomy gate and deployment policy govern what lands — do not bypass them.
|
|
197
|
+
|
|
198
|
+
Step 2b — Apply SAFE `target: self` proposals (self-modification path):
|
|
199
|
+
Self-modifications execute — they do not stop the loop. For each SAFE `target: self` proposal, apply the change, then — BEFORE committing — run the MANDATORY SAFETY GATE:
|
|
200
|
+
```bash
|
|
201
|
+
python3 scripts/self_mod_verify.py \
|
|
202
|
+
--workdir "$PWD" \
|
|
203
|
+
--scope auto \
|
|
204
|
+
--changed-files <the files you changed> \
|
|
205
|
+
--auto-revert \
|
|
206
|
+
--json
|
|
207
|
+
```
|
|
208
|
+
- `verdict: pass` → commit the change via the normal per-commit mode (one commit per self-modification; do not batch). The self-modification is recorded for the end-of-run readback.
|
|
209
|
+
- `verdict: fail` → the gate has already auto-reverted the change. Move the proposal to `.build-loop/proposals/failed-gate/` and continue with the next proposal. NEVER commit a failed-gate self-modification.
|
|
210
|
+
- Skip any `target: self` proposal that `classify_action.py` does not classify as SAFE (RISKY → isolate to worktree-branch + log; DECISION → queue to `.build-loop/proposals/needs-decision/`, do not apply).
|
|
211
|
+
|
|
212
|
+
Do NOT stop the loop for any self-modification, including those that touch the gate scripts, tests, or the self-improvement loop. The test-suite gate is the oracle; if it passes, the change commits and is reported at the end.
|
|
213
|
+
|
|
214
|
+
Step 3 — Determine push behavior:
|
|
215
|
+
Read `.build-loop/config.json` key `selfReview.autonomy` (default `apply_push`).
|
|
216
|
+
- If `apply_push`: after all SAFE proposals have been routed and landed, run `git push origin main` for the accumulated commits. Build-loop's deployment_policy still gates this; if the push is blocked by policy, log the block and exit 0 — do not force.
|
|
217
|
+
- If `apply_local`: do not push. Commits land locally; the user pushes manually.
|
|
218
|
+
|
|
219
|
+
Step 4 — Report:
|
|
220
|
+
Print a short summary: how many SAFE proposals were processed (split: standard vs `target: self`), how many RISKY/DECISION items were left queued, how many `target: self` proposals were gated/reverted by a failed test gate, and the push status (pushed / local-only / skipped by policy / n/a).
|
|
221
|
+
|
|
222
|
+
Include a `## Self-modifications (readback)` section listing every self-modification that landed this run: file, one-line what/why, test-gate verdict, and the additional-review finding (pass/flag). If no self-modifications occurred, omit the section.
|
|
223
|
+
|
|
224
|
+
Constraints:
|
|
225
|
+
- Never apply a RISKY or DECISION proposal autonomously.
|
|
226
|
+
- Never apply a `target: self` proposal without running `self_mod_verify.py` first.
|
|
227
|
+
- Never commit a change that `self_mod_verify.py` returned `verdict: fail` for.
|
|
228
|
+
- Never stop the loop for a self-modification — including those that touch the gate, tests, or self-improvement loop scripts. The test gate is the oracle; pass → commit and continue; fail → auto-revert and continue. Report at the end.
|
|
229
|
+
- Never bypass build-loop's commit auditor or autonomy gate.
|
|
230
|
+
- If build-loop is not available as a slash command, log the unavailability and exit 0 — the queue stays intact.
|
|
231
|
+
- This is a local developer tool; there are no users to protect other than the repo owner.
|
|
232
|
+
<!-- END_APPLY_PROMPT -->
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<!-- SPDX-FileCopyrightText: 2025-2026 Tyrone Ross, Jr <46267523+tyroneross@users.noreply.github.com> | SPDX-License-Identifier: Apache-2.0 -->
|
|
2
|
+
|
|
3
|
+
# UI Input/Output Contract
|
|
4
|
+
|
|
5
|
+
Use this contract for any build-loop task that adds, modifies, or validates a user-facing UI surface. It turns "build the component" into an explicit inventory of what the user can provide, what the system returns, and which UI pattern must handle each data shape.
|
|
6
|
+
|
|
7
|
+
## When It Applies
|
|
8
|
+
|
|
9
|
+
Apply this when `uiTarget != null` and the task changes any screen, component, form, table, chart, voice/audio affordance, file workflow, generated output, or streamed response. Skip only for copy-only changes that do not alter the available inputs, outputs, states, or operations.
|
|
10
|
+
|
|
11
|
+
## Required Plan Section
|
|
12
|
+
|
|
13
|
+
Every UI plan must include a `## UI Input/Output Contract` section before implementation. Use one row per affected screen or component, and keep each field concrete.
|
|
14
|
+
|
|
15
|
+
| Field | Required Answer |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Surface | Screen/component name plus file path |
|
|
18
|
+
| User inputs | Every value the user can provide |
|
|
19
|
+
| System outputs | Every value the user receives or decides from |
|
|
20
|
+
| Data taxonomy | Structural type, content format, persistence intent |
|
|
21
|
+
| Operation model | CRUD operation plus any domain verb |
|
|
22
|
+
| Component mapping | Exact input control and output renderer |
|
|
23
|
+
| State matrix | Empty, populated, focused, disabled, loading, success, error, and streaming/abort when relevant |
|
|
24
|
+
| Modality | Text, voice, file, vision, chart, map, AI/generated, or streaming; include fallback |
|
|
25
|
+
| Validation/security | Presentation, application, and domain validation; sanitization; auth/authz display behavior |
|
|
26
|
+
| Traceability | Data schema, API endpoint/method, design-system component, and rationale |
|
|
27
|
+
|
|
28
|
+
## Data Taxonomy
|
|
29
|
+
|
|
30
|
+
Classify each input and output before choosing UI controls:
|
|
31
|
+
|
|
32
|
+
- **Structural type**: scalar, structured object/array, binary, stream.
|
|
33
|
+
- **Content format**: plain text, Markdown, rich text, HTML, JSON tree, chart data, audio, image, map/geospatial.
|
|
34
|
+
- **Persistence intent**: persisted CRUD data, transient session state, real-time stream, computed/derived output.
|
|
35
|
+
|
|
36
|
+
## Operation Model
|
|
37
|
+
|
|
38
|
+
Name the operation the UI performs:
|
|
39
|
+
|
|
40
|
+
- **Create**: POST, form, wizard, inline add.
|
|
41
|
+
- **Read**: GET, table, card, detail view, chart.
|
|
42
|
+
- **Update**: PUT/PATCH, edit form, inline edit, toggle.
|
|
43
|
+
- **Delete**: DELETE, destructive button, confirmation.
|
|
44
|
+
- **Domain verbs**: submit, approve, publish, escalate, cancel, refund, reorder, filter, sort, export, download.
|
|
45
|
+
|
|
46
|
+
Do not hide domain verbs inside generic "update" language when rules, side effects, or affordances differ.
|
|
47
|
+
|
|
48
|
+
## Component Mapping
|
|
49
|
+
|
|
50
|
+
Choose components from the data shape, not habit.
|
|
51
|
+
|
|
52
|
+
| Data Shape | Input Control | Output Renderer |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| Short string | Single-line input | Text with overflow/copy behavior |
|
|
55
|
+
| Long plain text | Textarea with sizing policy | Paragraph or preformatted text |
|
|
56
|
+
| Markdown | Split write/preview editor | Sanitized Markdown renderer |
|
|
57
|
+
| Rich text | Schema-backed editor | Paired rich-text viewer |
|
|
58
|
+
| JSON/object | Schema-aware JSON editor/tree | Collapsible tree or raw/parsed toggle |
|
|
59
|
+
| Number | Number input, slider, or stepper | Locale-aware number display |
|
|
60
|
+
| Boolean | Toggle, checkbox, or yes/no radio | Explicit state label |
|
|
61
|
+
| Date/time | Date/time/range picker | Locale/timezone-aware display |
|
|
62
|
+
| Enum | Select, radio group, or searchable select when options exceed seven | Label/chip/list value |
|
|
63
|
+
| File/binary | Upload/dropzone with progress | Preview/download with file metadata |
|
|
64
|
+
| Voice/audio | Mic button with waveform and text fallback | Audio player/TTS plus transcript |
|
|
65
|
+
| Tabular data | Filters/search feeding table | Sort/filter/paginated table |
|
|
66
|
+
| Chart data | Form/filter inputs feeding visualization | Named chart type plus table fallback |
|
|
67
|
+
| Streaming/AI output | Prompt or structured input | Token/partial renderer with abort and retry |
|
|
68
|
+
| Geospatial | Address/map controls | Map with markers/clusters and fallback text |
|
|
69
|
+
|
|
70
|
+
## State Matrix
|
|
71
|
+
|
|
72
|
+
Document the states each component must render:
|
|
73
|
+
|
|
74
|
+
- Default/empty.
|
|
75
|
+
- Populated/filled.
|
|
76
|
+
- Focused.
|
|
77
|
+
- Hover on pointer devices.
|
|
78
|
+
- Active/pressed.
|
|
79
|
+
- Disabled/permission-blocked.
|
|
80
|
+
- Loading.
|
|
81
|
+
- Success.
|
|
82
|
+
- Error/invalid.
|
|
83
|
+
- Empty result.
|
|
84
|
+
- Streaming/partial with abort and retry behavior when relevant.
|
|
85
|
+
|
|
86
|
+
## Modalities
|
|
87
|
+
|
|
88
|
+
When a modality exists, it needs its own UI and failure path:
|
|
89
|
+
|
|
90
|
+
- **Text**: text input, textarea, rich text, text/Markdown renderer.
|
|
91
|
+
- **Voice**: push-to-talk or wake-word trigger, ASR provider/threshold if known, transcript fallback, TTS controls.
|
|
92
|
+
- **File**: upload control, MIME/size rules, preview/download, copy-text fallback.
|
|
93
|
+
- **Vision/image**: image upload/camera, viewer/annotation, alt-text fallback.
|
|
94
|
+
- **Chart/graph**: chart type, data schema, axis labels, colorblind-safe palette, table fallback.
|
|
95
|
+
- **AI/generated output**: output type contract, response schema/template, streaming vs complete mode, abort/retry behavior.
|
|
96
|
+
|
|
97
|
+
## Validation And Security
|
|
98
|
+
|
|
99
|
+
Validation must be named by layer:
|
|
100
|
+
|
|
101
|
+
- **Presentation**: required fields, max length, pattern, type, inline field errors.
|
|
102
|
+
- **Application**: cross-field and business-rule errors, form-level/toast surface.
|
|
103
|
+
- **Domain**: invariant failures, system-error surface, and whether repeated domain failures indicate a spec gap.
|
|
104
|
+
- **Sanitization**: allowed subset for Markdown, rich text, HTML, JSON, and generated content.
|
|
105
|
+
- **Auth/authz**: permission required for create/update/delete/domain verbs, and UI behavior when denied: hidden, disabled, or 403/empty view.
|
|
106
|
+
|
|
107
|
+
## Traceability
|
|
108
|
+
|
|
109
|
+
Each UI element that accepts or returns data must trace to:
|
|
110
|
+
|
|
111
|
+
- Data model or schema version.
|
|
112
|
+
- API endpoint/method or local data source.
|
|
113
|
+
- Design-system component or explicit net-new rationale.
|
|
114
|
+
- Test or validation evidence.
|
|
115
|
+
|
|
116
|
+
If the trace cannot be named, the plan is incomplete.
|