@event4u/agent-config 14.22.0 → 15.0.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +333 -356
- package/README.md +1 -1
- package/dist/agent-src/commands/agent-handoff.md +8 -7
- package/dist/agent-src/commands/agents/init.md +1 -1
- package/dist/agent-src/commands/agents/user/accept.md +4 -4
- package/dist/agent-src/commands/agents/user/delete.md +2 -2
- package/dist/agent-src/commands/agents/user/init.md +3 -3
- package/dist/agent-src/commands/agents/user/review.md +3 -3
- package/dist/agent-src/commands/agents/user/show.md +3 -3
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +6 -6
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +2 -2
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +5 -5
- package/dist/agent-src/commands/analyze/incident.md +3 -3
- package/dist/agent-src/commands/analyze/near-miss.md +3 -3
- package/dist/agent-src/commands/analyze/postmortem.md +4 -4
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/analyze.md +2 -2
- package/dist/agent-src/commands/bug/fix.md +1 -1
- package/dist/agent-src/commands/bug/investigate.md +2 -2
- package/dist/agent-src/commands/cost/profile.md +3 -3
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +1 -1
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +2 -2
- package/dist/agent-src/commands/ghostwriter/fetch.md +4 -4
- package/dist/agent-src/commands/ghostwriter/list.md +1 -1
- package/dist/agent-src/commands/ghostwriter/show.md +1 -1
- package/dist/agent-src/commands/ghostwriter/write.md +9 -9
- package/dist/agent-src/commands/humanize.md +6 -6
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/judge/solo.md +1 -1
- package/dist/agent-src/commands/judge.md +1 -1
- package/dist/agent-src/commands/knowledge/cross-repo.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +2 -2
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/add.md +3 -3
- package/dist/agent-src/commands/memory/load.md +4 -4
- package/dist/agent-src/commands/memory/mine-session.md +1 -1
- package/dist/agent-src/commands/memory/promote.md +4 -4
- package/dist/agent-src/commands/memory/propose.md +2 -2
- package/dist/agent-src/commands/mode.md +5 -5
- package/dist/agent-src/commands/post-as/ghostwriter.md +3 -3
- package/dist/agent-src/commands/post-as/me.md +7 -7
- package/dist/agent-src/commands/pr/create.md +1 -1
- package/dist/agent-src/commands/pr/merge.md +48 -39
- package/dist/agent-src/commands/profile/activate.md +1 -1
- package/dist/agent-src/commands/profile/show.md +1 -1
- package/dist/agent-src/commands/research/deep.md +2 -2
- package/dist/agent-src/commands/research/report.md +2 -2
- package/dist/agent-src/commands/review/changes.md +1 -1
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +2 -2
- package/dist/agent-src/commands/roadmap/next.md +9 -1
- package/dist/agent-src/commands/roadmap/process-full.md +2 -2
- package/dist/agent-src/commands/security-audit-config.md +3 -3
- package/dist/agent-src/commands/skill/preview.md +1 -1
- package/dist/agent-src/commands/skills/discover.md +1 -1
- package/dist/agent-src/commands/sync/agent-settings.md +2 -2
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tests/create.md +1 -1
- package/dist/agent-src/commands/tests/e2e-heal.md +1 -1
- package/dist/agent-src/commands/tests/e2e-plan.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +6 -6
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -2
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +88 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +1 -1
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +13 -1
- package/dist/agent-src/contexts/execution/cheap-question-mechanics.md +1 -1
- package/dist/agent-src/contexts/execution/contract-decision-sheet.md +3 -3
- package/dist/agent-src/contexts/execution/mandated-lines.md +1 -1
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +1 -1
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -1
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +5 -5
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +1 -1
- package/dist/agent-src/contexts/execution/subagent-routing.md +2 -2
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +3 -3
- package/dist/agent-src/contexts/execution/verification-mechanics.md +1 -1
- package/dist/agent-src/contexts/judges/persona-voice-rubric.md +2 -2
- package/dist/agent-src/guidelines/abstraction-thresholds.md +88 -0
- package/dist/agent-src/guidelines/agent-infra/5w2h-analysis.md +260 -0
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +99 -0
- package/dist/agent-src/guidelines/agent-infra/agent-interaction-and-decision-quality.md +325 -0
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +222 -0
- package/dist/agent-src/guidelines/agent-infra/ask-when-uncertain-demos.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/asking-and-brevity-examples.md +198 -0
- package/dist/agent-src/guidelines/agent-infra/break-glass-usage.md +113 -0
- package/dist/agent-src/guidelines/agent-infra/carve-out-predicates.md +17 -0
- package/dist/agent-src/guidelines/agent-infra/comparison-matrix.md +179 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +165 -0
- package/dist/agent-src/guidelines/agent-infra/corpus-grounding-authoring.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/critical-thinking.md +156 -0
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/developer-judgment.md +82 -0
- package/dist/agent-src/guidelines/agent-infra/direct-answers-demos.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/domain-adoption-gates.md +112 -0
- package/dist/agent-src/guidelines/agent-infra/domain-eval-anti-pattern.md +53 -0
- package/dist/agent-src/guidelines/agent-infra/domain-pack-architecture.md +56 -0
- package/dist/agent-src/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/dist/agent-src/guidelines/agent-infra/emphasis-budget.md +45 -0
- package/dist/agent-src/guidelines/agent-infra/engineering-memory-data-format.md +210 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/dist/agent-src/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/failure-signatures.md +70 -0
- package/dist/agent-src/guidelines/agent-infra/false-green.md +233 -0
- package/dist/agent-src/guidelines/agent-infra/first-principles.md +192 -0
- package/dist/agent-src/guidelines/agent-infra/framework-neutrality-patterns.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +169 -0
- package/dist/agent-src/guidelines/agent-infra/gate-authoring.md +177 -0
- package/dist/agent-src/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/installed-tools-manifest.md +142 -0
- package/dist/agent-src/guidelines/agent-infra/inversion-thinking.md +388 -0
- package/dist/agent-src/guidelines/agent-infra/ios-simulator-guide.md +378 -0
- package/dist/agent-src/guidelines/agent-infra/language-and-tone-examples.md +141 -0
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +317 -0
- package/dist/agent-src/guidelines/agent-infra/linked-projects-onboarding-gate.md +80 -0
- package/dist/agent-src/guidelines/agent-infra/mcp-request-signing.md +197 -0
- package/dist/agent-src/guidelines/agent-infra/memory-access.md +149 -0
- package/dist/agent-src/guidelines/agent-infra/mental-models.md +314 -0
- package/dist/agent-src/guidelines/agent-infra/minimal-safe-diff-mechanics.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/missing-tool-handling.md +66 -0
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +101 -0
- package/dist/agent-src/guidelines/agent-infra/naming.md +69 -0
- package/dist/agent-src/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/dist/agent-src/guidelines/agent-infra/output-patterns.md +117 -0
- package/dist/agent-src/guidelines/agent-infra/recurring-criticism-mechanics.md +96 -0
- package/dist/agent-src/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/dist/agent-src/guidelines/agent-infra/review-routing-data-format.md +143 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +274 -0
- package/dist/agent-src/guidelines/agent-infra/role-contracts.md +209 -0
- package/dist/agent-src/guidelines/agent-infra/role-mode-router.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +241 -0
- package/dist/agent-src/guidelines/agent-infra/rule-type-governance.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/runtime-layer.md +89 -0
- package/dist/agent-src/guidelines/agent-infra/scqa-framework.md +526 -0
- package/dist/agent-src/guidelines/agent-infra/security-lint-containment.md +121 -0
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +134 -0
- package/dist/agent-src/guidelines/agent-infra/simplicity-and-goal-demos.md +211 -0
- package/dist/agent-src/guidelines/agent-infra/six-hats.md +353 -0
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +229 -0
- package/dist/agent-src/guidelines/agent-infra/skill-quality-checklist.md +157 -0
- package/dist/agent-src/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/dist/agent-src/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
- package/dist/agent-src/guidelines/agent-infra/systems-thinking.md +220 -0
- package/dist/agent-src/guidelines/agent-infra/tool-description-as-policy.md +35 -0
- package/dist/agent-src/guidelines/agent-infra/tool-integration.md +73 -0
- package/dist/agent-src/guidelines/agent-infra/traceability-field-mechanics.md +50 -0
- package/dist/agent-src/guidelines/agent-infra/untrusted-input-spotlighting.md +166 -0
- package/dist/agent-src/guidelines/agent-infra/verify-before-complete-demos.md +128 -0
- package/dist/agent-src/guidelines/augment-portability-patterns.md +70 -0
- package/dist/agent-src/guidelines/code-clarity.md +350 -0
- package/dist/agent-src/guidelines/component-oriented-and-oop-development.md +189 -0
- package/dist/agent-src/guidelines/cross-role-handoff.md +127 -0
- package/dist/agent-src/guidelines/design-antipatterns-triggers.json +18 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +327 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +38 -0
- package/dist/agent-src/guidelines/design-canon.md +63 -0
- package/dist/agent-src/guidelines/design-fidelity-mechanics.md +293 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +78 -0
- package/dist/agent-src/guidelines/design-handover-extraction.md +117 -0
- package/dist/agent-src/guidelines/design-modes.md +143 -0
- package/dist/agent-src/guidelines/design-reconciliation.md +172 -0
- package/dist/agent-src/guidelines/docs/readme-size-and-splitting.md +209 -0
- package/dist/agent-src/guidelines/e2e/playwright.md +363 -0
- package/dist/agent-src/guidelines/gtm-handoff.md +114 -0
- package/dist/agent-src/guidelines/monorepo-antipatterns.md +141 -0
- package/dist/agent-src/guidelines/php/api-design.md +115 -0
- package/dist/agent-src/guidelines/php/artisan-commands.md +81 -0
- package/dist/agent-src/guidelines/php/blade-ui.md +78 -0
- package/dist/agent-src/guidelines/php/controllers.md +90 -0
- package/dist/agent-src/guidelines/php/database.md +194 -0
- package/dist/agent-src/guidelines/php/eloquent.md +208 -0
- package/dist/agent-src/guidelines/php/flux.md +80 -0
- package/dist/agent-src/guidelines/php/general.md +207 -0
- package/dist/agent-src/guidelines/php/git.md +164 -0
- package/dist/agent-src/guidelines/php/jobs.md +111 -0
- package/dist/agent-src/guidelines/php/livewire.md +71 -0
- package/dist/agent-src/guidelines/php/logging.md +79 -0
- package/dist/agent-src/guidelines/php/naming.md +89 -0
- package/dist/agent-src/guidelines/php/patterns/dependency-injection.md +57 -0
- package/dist/agent-src/guidelines/php/patterns/dtos.md +199 -0
- package/dist/agent-src/guidelines/php/patterns/events.md +67 -0
- package/dist/agent-src/guidelines/php/patterns/factory.md +53 -0
- package/dist/agent-src/guidelines/php/patterns/pipelines.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/policies.md +66 -0
- package/dist/agent-src/guidelines/php/patterns/repositories.md +122 -0
- package/dist/agent-src/guidelines/php/patterns/service-layer.md +64 -0
- package/dist/agent-src/guidelines/php/patterns/strategy.md +247 -0
- package/dist/agent-src/guidelines/php/patterns.md +28 -0
- package/dist/agent-src/guidelines/php/performance.md +92 -0
- package/dist/agent-src/guidelines/php/php-coding-patterns.md +80 -0
- package/dist/agent-src/guidelines/php/resources.md +100 -0
- package/dist/agent-src/guidelines/php/security.md +110 -0
- package/dist/agent-src/guidelines/php/sql.md +97 -0
- package/dist/agent-src/guidelines/php/validations.md +119 -0
- package/dist/agent-src/guidelines/php/websocket.md +100 -0
- package/dist/agent-src/guidelines/prompt-templates.md +189 -0
- package/dist/agent-src/guidelines/redundancy-taxonomy.md +208 -0
- package/dist/agent-src/guidelines/wing4-handoff.md +127 -0
- package/dist/agent-src/personas/README.md +1 -1
- package/dist/agent-src/personas/_template-specialist/persona.md +1 -1
- package/dist/agent-src/personas/product-owner.md +1 -1
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/architecture.md +2 -2
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/ask-when-uncertain.md +2 -2
- package/dist/agent-src/rules/brand-source-of-truth.md +9 -7
- package/dist/agent-src/rules/code-comment-discipline.md +2 -2
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/content-quoting-floor.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/cross-source-consistency.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +36 -46
- package/dist/agent-src/rules/direct-answers.md +2 -2
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/icon-consistency.md +5 -1
- package/dist/agent-src/rules/improve-before-implement.md +1 -1
- package/dist/agent-src/rules/language-and-tone.md +3 -3
- package/dist/agent-src/rules/minimal-safe-diff.md +1 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +36 -25
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/role-mode-adherence.md +2 -2
- package/dist/agent-src/rules/security-sensitive-stop.md +1 -1
- package/dist/agent-src/rules/size-enforcement.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +2 -2
- package/dist/agent-src/rules/think-before-action.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +7 -5
- package/dist/agent-src/rules/ui-audit-gate.md +3 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +3 -3
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
- package/dist/agent-src/skills/activation-design/SKILL.md +2 -2
- package/dist/agent-src/skills/adr-create/SKILL.md +5 -5
- package/dist/agent-src/skills/ai-council/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +1 -1
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +24 -3
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/build-buy-partner/SKILL.md +1 -1
- package/dist/agent-src/skills/churn-prevention/SKILL.md +2 -2
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -1
- package/dist/agent-src/skills/code-refactoring/SKILL.md +3 -3
- package/dist/agent-src/skills/code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/command-writing/SKILL.md +3 -3
- package/dist/agent-src/skills/comp-banding/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-moat-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +2 -2
- package/dist/agent-src/skills/contracts-cognition/SKILL.md +1 -1
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +2 -2
- package/dist/agent-src/skills/customer-research/SKILL.md +2 -2
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-handling-judgment/SKILL.md +1 -1
- package/dist/agent-src/skills/deal-qualification-meddic/SKILL.md +2 -2
- package/dist/agent-src/skills/decision-record/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-review/SKILL.md +8 -8
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +22 -22
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +2 -2
- package/dist/agent-src/skills/design-review/SKILL.md +4 -4
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -1
- package/dist/agent-src/skills/design-tokens/SKILL.md +17 -2
- package/dist/agent-src/skills/design-variations/SKILL.md +2 -2
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +2 -2
- package/dist/agent-src/skills/discovery-interview/SKILL.md +2 -2
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +3 -3
- package/dist/agent-src/skills/editorial-calendar/SKILL.md +2 -2
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +44 -1
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +2 -2
- package/dist/agent-src/skills/expansion-playbook/SKILL.md +2 -2
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/experiment-loop/references/protocol.md +1 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +3 -3
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +3 -3
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/forecast-accuracy/SKILL.md +2 -2
- package/dist/agent-src/skills/forecasting/SKILL.md +2 -2
- package/dist/agent-src/skills/fundraising-narrative/SKILL.md +2 -2
- package/dist/agent-src/skills/funnel-analysis/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +9 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +2 -2
- package/dist/agent-src/skills/hiring-loop-design/SKILL.md +1 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +5 -5
- package/dist/agent-src/skills/humanizer/SKILL.md +1 -1
- package/dist/agent-src/skills/humanizer/data/patterns.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +3 -3
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +3 -3
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +6 -6
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/mcp-builder/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +3 -3
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +2 -2
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/onboarding-design/SKILL.md +2 -2
- package/dist/agent-src/skills/onboarding-program/SKILL.md +1 -1
- package/dist/agent-src/skills/one-on-one-cadence/SKILL.md +1 -1
- package/dist/agent-src/skills/org-design/SKILL.md +1 -1
- package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +3 -3
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/perf-feedback-craft/SKILL.md +1 -1
- package/dist/agent-src/skills/persona-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/php-coder/SKILL.md +1 -1
- package/dist/agent-src/skills/pipeline-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -3
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +2 -2
- package/dist/agent-src/skills/privacy-review/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +3 -3
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +2 -2
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/release-comms/SKILL.md +2 -2
- package/dist/agent-src/skills/retention-loops/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +1 -1
- package/dist/agent-src/skills/roadmap-management/references/archival.md +1 -1
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +5 -5
- package/dist/agent-src/skills/rule-writing/SKILL.md +6 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +2 -2
- package/dist/agent-src/skills/scenario-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-writing/references/procedure.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +3 -3
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +3 -3
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +1 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +60 -4
- package/dist/agent-src/skills/throughput-vs-morale-tradeoff/SKILL.md +1 -1
- package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +28 -8
- package/dist/agent-src/skills/unit-economics-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +1 -1
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/vision-articulation/SKILL.md +1 -1
- package/dist/agent-src/skills/voc-extract/SKILL.md +2 -2
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +1 -1
- package/dist/agent-src/skills/workspace-link/SKILL.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +6 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +2 -3
- package/dist/agent-src/templates/copilot-instructions.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +2 -2
- package/dist/agent-src/user-types/_template/user-type.md +1 -1
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +52 -4
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/{chunk-TGIPZBCW.js → chunk-2KKXJW25.js} +22 -8
- package/dist/cli-delegate/{chunk-NLP54U3J.js → chunk-2XY7ILBT.js} +13 -1
- package/dist/cli-delegate/{chunk-4FS4WRXP.js → chunk-3FKR64R5.js} +34 -6
- package/dist/cli-delegate/{chunk-J3RFNKG4.js → chunk-55ACLDUE.js} +2 -2
- package/dist/cli-delegate/{chunk-PKOBQADP.js → chunk-57PN4GYJ.js} +1 -1
- package/dist/cli-delegate/{chunk-BIXEDQPZ.js → chunk-AK6HODNQ.js} +4 -4
- package/dist/cli-delegate/{chunk-2FTMENJL.js → chunk-GYC3VRYN.js} +1 -1
- package/dist/cli-delegate/{chunk-LWTYTX6F.js → chunk-HZ52BRGG.js} +24 -18
- package/dist/cli-delegate/{chunk-6RJA2F5A.js → chunk-IVBPRCQO.js} +1 -1
- package/dist/cli-delegate/{chunk-I6RHFQEG.js → chunk-YUM5KURG.js} +17 -1
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +24 -16
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +3 -3
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +4 -14
- package/dist/cli-delegate/cmd_settings_get.js +15 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +41 -11
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +27 -80
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +5 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +4 -6
- package/dist/hooks/dispatch.js +9249 -8981
- package/dist/install/install.mjs +47 -8
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +5496 -2400
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +73 -0
- package/dist/scripts/_lib/agent_src.js +20 -0
- package/dist/scripts/_lib/guidelines_lane.js +158 -0
- package/dist/scripts/_lib/lean_projection_mode.js +108 -0
- package/dist/scripts/_lib/router_match.js +243 -0
- package/dist/scripts/_lib/rule_injection.js +216 -0
- package/dist/scripts/condense.js +22 -25
- package/dist/scripts/project_thin_rules.js +139 -19
- package/dist/server/io/yamlIO.js +125 -17
- package/dist/server/schemas/settings.js +32 -5
- package/dist/shared/settingsSurface.js +6 -1
- package/docs/MIGRATION.md +56 -0
- package/docs/contracts/settings-classes.md +48 -7
- package/docs/guidelines/abstraction-thresholds.md +35 -0
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +3 -3
- package/docs/guidelines/agent-infra/false-green.md +2 -2
- package/docs/guidelines/agent-infra/notes-horizon-mechanics.md +90 -0
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +4 -0
- package/docs/guidelines/design-fidelity-routing.md +78 -0
- package/docs/guidelines/design-reconciliation.md +172 -0
- package/docs/guidelines/gtm-handoff.md +2 -2
- package/docs/guidelines/wing4-handoff.md +2 -2
- package/llms.txt +1 -1
- package/package.json +7 -3
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +106 -4
- package/src/config/agent-settings.template.yml +94 -1
- package/src/config/ci-local-parity.yml +34 -0
- package/src/config/continuity-surface.json +8 -29
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +31 -8
- package/src/config/gate-reachability-exemptions.json +1 -0
- package/src/config/gate-violation-baselines.json +3 -3
- package/src/config/hook-token-budget.json +8 -7
- package/src/config/host-injection-effect.json +2 -2
- package/src/config/pack-size-budget.json +55 -4
- package/src/config/packed-binary-manifest.json +1 -1
- package/src/config/platform-anchor.json +47 -0
- package/src/config/preamble-payload-budget.json +2 -3
- package/src/config/publish-surface.json +4 -2
- package/src/config/ratification-policy.json +7 -0
- package/src/config/routing-coverage-seed.json +9 -2
- package/src/config/rule-stub-ceilings.json +16 -9
- package/src/scripts/_cli/cmd_session_recycle.ts +2 -25
- package/src/scripts/_cli/cmd_settings_get.ts +22 -7
- package/src/scripts/_cli/handoff_sessions.ts +14 -44
- package/src/scripts/_lib/agent_settings.ts +85 -0
- package/src/scripts/_lib/agent_src.ts +21 -0
- package/src/scripts/_lib/artifact_maturity.ts +242 -0
- package/src/scripts/_lib/conformance_report.ts +403 -0
- package/src/scripts/_lib/continuity_slot.ts +295 -0
- package/src/scripts/_lib/continuity_writer.ts +312 -0
- package/src/scripts/_lib/design_system_import.ts +20 -0
- package/src/scripts/_lib/design_tolerance.ts +281 -0
- package/src/scripts/_lib/guidelines_lane.ts +164 -0
- package/src/scripts/_lib/hook_settings.ts +85 -0
- package/src/scripts/_lib/lean_projection_mode.ts +127 -0
- package/src/scripts/_lib/obligation_frequency.ts +2 -3
- package/src/scripts/_lib/packed_binary_predicate.ts +37 -0
- package/src/scripts/_lib/platform_anchor.ts +1053 -0
- package/src/scripts/_lib/ratification_artifact.ts +278 -0
- package/src/scripts/_lib/recycle_envelope_paths.ts +109 -21
- package/src/scripts/_lib/regression_neighbourhood.ts +159 -22
- package/src/scripts/_lib/security_lint.ts +23 -2
- package/src/scripts/_lib/self_repair.ts +21 -0
- package/src/scripts/_lib/session_eol.ts +44 -0
- package/src/scripts/_lib/session_index_trust.ts +387 -0
- package/src/scripts/_lib/standing_bound_ratchet.ts +220 -0
- package/src/scripts/_lib/tolerance_shadow.ts +177 -0
- package/src/scripts/_lib/vendored_grammar_upstream.ts +280 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +8 -0
- package/src/scripts/audit_mcp_tools.ts +69 -25
- package/src/scripts/autonomy_friction_traffic.ts +379 -0
- package/src/scripts/build_mcp_catalog.ts +24 -1
- package/src/scripts/check_host_tree_parity.ts +291 -0
- package/src/scripts/check_kernel_edit_ratified.ts +462 -0
- package/src/scripts/check_loss_class_declared.ts +793 -46
- package/src/scripts/check_platform_anchor.ts +390 -0
- package/src/scripts/check_preamble_payload_budget.ts +424 -7
- package/src/scripts/check_projected_rule_routes.ts +395 -0
- package/src/scripts/check_rule_projection_integrity.ts +102 -2
- package/src/scripts/ci_settle.ts +205 -5
- package/src/scripts/code_graph/build.ts +79 -0
- package/src/scripts/code_graph/cli.ts +264 -7
- package/src/scripts/code_graph/detect.ts +38 -0
- package/src/scripts/code_graph/query.ts +25 -2
- package/src/scripts/code_graph/sqlite_store.ts +16 -1
- package/src/scripts/code_graph/types.ts +52 -3
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +590 -0
- package/src/scripts/condense.ts +22 -26
- package/src/scripts/generate_host_cost_table.ts +354 -0
- package/src/scripts/handoff_context_hook.ts +39 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +59 -28
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +182 -16
- package/src/scripts/hooks/category_a.ts +1 -1
- package/src/scripts/hooks/chain_nudge_hook.ts +311 -25
- package/src/scripts/hooks/code_graph_context_hook.ts +7 -18
- package/src/scripts/hooks/push_settle_hook.ts +3 -2
- package/src/scripts/hooks/rule_inject_hook.ts +107 -20
- package/src/scripts/hooks/session_eol_hook.ts +177 -145
- package/src/scripts/hooks/source_first_gate_hook.ts +12 -0
- package/src/scripts/hooks/ui_route_nudge_hook.ts +52 -15
- package/src/scripts/hot_context_hook.ts +103 -408
- package/src/scripts/lint_evidence_artifacts.ts +1 -0
- package/src/scripts/lint_knowledge_scale.ts +0 -26
- package/src/scripts/lint_roadmap_blockers.ts +164 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +152 -2
- package/src/scripts/mcp_server/graph_tools.ts +294 -0
- package/src/scripts/mcp_server/path_util.ts +31 -0
- package/src/scripts/mcp_server/tool_catalog_source.ts +7 -1
- package/src/scripts/mcp_server/tools.ts +3 -13
- package/src/scripts/memory_lookup.ts +9 -9
- package/src/scripts/model_rule_injection.ts +61 -4
- package/src/scripts/project_thin_rules.ts +149 -16
- package/src/scripts/report_standing_payload_by_host.ts +650 -0
- package/src/scripts/schemas/agent-settings.schema.json +7 -1
- package/src/scripts/session_memory_index.ts +86 -8
- package/src/scripts/sync_agent_settings.ts +270 -10
- package/src/server/io/yamlIO.ts +127 -17
- package/src/server/schemas/settings.ts +45 -6
- package/src/shared/settingsSurface.ts +13 -2
- package/src/templates/compact-instructions.md +8 -3
- package/src/vendor/grammars/README.md +27 -2
- package/dist/agent-src/commands/chat-history/import.md +0 -170
- package/dist/agent-src/commands/chat-history.md +0 -63
|
@@ -18,7 +18,24 @@
|
|
|
18
18
|
* bucket has no local source at all — the census reports that one as an explicit
|
|
19
19
|
* residual rather than pretending to measure it.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
21
|
+
* THE BOUND IS SHRINK-ONLY, AND NOW CHECKED
|
|
22
|
+
* ------------------------------------------
|
|
23
|
+
* `ci_delivery.why_a_grace_ceiling` says of the grace ceiling *"It may never
|
|
24
|
+
* move UP"*, and `grace_ceiling_history` in the same file records it moving up
|
|
25
|
+
* twice. ADR-264 resolved that against the practice — the sentence stands — and
|
|
26
|
+
* left the sentence unenforced, which is exactly the state that produced both
|
|
27
|
+
* raises. `_lib/standing_bound_ratchet.ts` is the enforcement: the effective
|
|
28
|
+
* ceiling is compared against the one at the base ref and a rise refuses the run,
|
|
29
|
+
* whether it arrived by editing the config or by passing a bigger `--ceiling`.
|
|
30
|
+
*
|
|
31
|
+
* It is also ALL that `road-to-a-standing-budget-with-headroom` step 1.3 ships.
|
|
32
|
+
* That step designed a 128-token Iron Law reserve; an AI council refused to
|
|
33
|
+
* activate it 2/2 on 2026-09-08 because the verifier is inside the change under
|
|
34
|
+
* review, so a protected approval record grants nothing. ADR-265 carries the
|
|
35
|
+
* verdict and the activation prerequisites.
|
|
36
|
+
*
|
|
37
|
+
* Exit codes: 0 within budget · 1 over budget or the bound rose · 2 misuse /
|
|
38
|
+
* unreadable budget.
|
|
22
39
|
*/
|
|
23
40
|
import { execFileSync } from 'node:child_process';
|
|
24
41
|
import * as fs from 'node:fs';
|
|
@@ -28,7 +45,15 @@ import * as path from 'node:path';
|
|
|
28
45
|
import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
|
|
29
46
|
import { censusClaudeMdHierarchy, censusRuleDir, censusSkillsCatalog } from './preamble_byte_census.js';
|
|
30
47
|
import { PREFIX_STABLE_SURFACES, prefixStableRoots } from './_lib/prefix_stable_surfaces.js';
|
|
48
|
+
import { HOST_SURFACES } from './_lib/host_projection_reach.js';
|
|
31
49
|
import { attributeGrowth, buildLedger, renderAttribution } from './_lib/asset_delivery_ledger.js';
|
|
50
|
+
import { resolveBaseRef } from './_lib/ratchet_base_ref.js';
|
|
51
|
+
import {
|
|
52
|
+
assertBoundsDidNotRise,
|
|
53
|
+
type BoundsRatchetVerdict,
|
|
54
|
+
type GitRunner,
|
|
55
|
+
realGit,
|
|
56
|
+
} from './_lib/standing_bound_ratchet.js';
|
|
32
57
|
|
|
33
58
|
const HERE = path.dirname(new URL(import.meta.url).pathname);
|
|
34
59
|
const REPO_ROOT = path.resolve(HERE, '..', '..');
|
|
@@ -38,6 +63,15 @@ interface Budget {
|
|
|
38
63
|
baseline_tokens: number;
|
|
39
64
|
headroom_pct: number;
|
|
40
65
|
target_tokens: { median: number; p95: number };
|
|
66
|
+
/**
|
|
67
|
+
* `ci_delivery.grace_ceiling`, or `null` when the file carries none.
|
|
68
|
+
*
|
|
69
|
+
* Read here only so the shrink-only ratchet has a head-side value on a local
|
|
70
|
+
* run that passes no `--ceiling`. The number the payload is COMPARED against
|
|
71
|
+
* still arrives through the flag, so this does not become a second home for
|
|
72
|
+
* the ceiling.
|
|
73
|
+
*/
|
|
74
|
+
grace_ceiling: number | null;
|
|
41
75
|
}
|
|
42
76
|
|
|
43
77
|
export interface BudgetVerdict {
|
|
@@ -60,10 +94,13 @@ export function readBudget(file: string = BUDGET_FILE): Budget {
|
|
|
60
94
|
throw new Error(`${file}: baseline_tokens and headroom_pct must both be numbers`);
|
|
61
95
|
}
|
|
62
96
|
const target = (raw['target_tokens'] ?? {}) as Record<string, unknown>;
|
|
97
|
+
const delivery = (raw['ci_delivery'] ?? {}) as Record<string, unknown>;
|
|
98
|
+
const grace = Number(delivery['grace_ceiling']);
|
|
63
99
|
return {
|
|
64
100
|
baseline_tokens: baseline,
|
|
65
101
|
headroom_pct: headroom,
|
|
66
102
|
target_tokens: { median: Number(target['median']), p95: Number(target['p95']) },
|
|
103
|
+
grace_ceiling: Number.isFinite(grace) ? grace : null,
|
|
67
104
|
};
|
|
68
105
|
}
|
|
69
106
|
|
|
@@ -113,6 +150,174 @@ export function measureDeterministicPayload(
|
|
|
113
150
|
];
|
|
114
151
|
}
|
|
115
152
|
|
|
153
|
+
/**
|
|
154
|
+
* THE HOST READING — additive, and deliberately not the ratchet's surface.
|
|
155
|
+
*
|
|
156
|
+
* `measureDeterministicPayload` above measures `dist/agent-src/rules`: the
|
|
157
|
+
* projection SOURCE. That is the right surface for the shrink-only ratchet,
|
|
158
|
+
* because the source is what every host tree is written FROM and what a pull
|
|
159
|
+
* request actually edits. It is the wrong surface for one question: how many
|
|
160
|
+
* standing tokens does a session on host X start with? Under a per-host
|
|
161
|
+
* `delivery` projection the two answers diverge by design — measured 2026-09-07,
|
|
162
|
+
* `.claude/rules` went 99,598 tok to 24,166 tok while the source stayed at
|
|
163
|
+
* 138,200 either side of the flip.
|
|
164
|
+
*
|
|
165
|
+
* So this adds a SECOND reading and changes nothing about the first. AI council
|
|
166
|
+
* of 2026-09-09 (2/2 present, converged on option 1A):
|
|
167
|
+
*
|
|
168
|
+
* - the no-argument source measurement, the blocking CI invocation, the
|
|
169
|
+
* `task ci` invocation and the base-ref ratchet are untouched, so no
|
|
170
|
+
* existing baseline or history entry is reinterpreted;
|
|
171
|
+
* - the host reading is reported alongside and NEVER changes the exit code —
|
|
172
|
+
* an informational census, not a second gate.
|
|
173
|
+
*
|
|
174
|
+
* Both seats were explicit that the host id must resolve through the existing
|
|
175
|
+
* projection registry rather than a path map invented here, which is why the
|
|
176
|
+
* roots come from `HOST_SURFACES` in `_lib/host_projection_reach.ts` — the same
|
|
177
|
+
* committed constant `check_host_projection_reach` walks.
|
|
178
|
+
*/
|
|
179
|
+
export interface HostPayload {
|
|
180
|
+
/** The host id as given, or `null` when a raw rules-dir override was used. */
|
|
181
|
+
host: string | null;
|
|
182
|
+
/** Repo-relative rules root actually measured. */
|
|
183
|
+
rules_path: string;
|
|
184
|
+
buckets: Array<{ name: string; tokens: number; files: number }>;
|
|
185
|
+
total: number;
|
|
186
|
+
/**
|
|
187
|
+
* Rule files in the host tree, against rule files in the projection source.
|
|
188
|
+
*
|
|
189
|
+
* A maintainer checkout is NOT a consumer install and its host tree is
|
|
190
|
+
* routinely smaller for reasons that have nothing to do with a projection
|
|
191
|
+
* mode: the installer deduplicates a project rule against the same rule
|
|
192
|
+
* already present at user scope, and a dev tree may hold a partial
|
|
193
|
+
* projection. Measured in this repository 2026-09-09: 13 files under
|
|
194
|
+
* `.claude/rules` against 119 in `dist/agent-src/rules`.
|
|
195
|
+
*
|
|
196
|
+
* A bare token total cannot tell a genuine saving from a tree that was never
|
|
197
|
+
* fully written, and those two send a reader to completely different places.
|
|
198
|
+
* So the counts travel with the number, and `complete` is false whenever the
|
|
199
|
+
* host tree holds fewer rule files than the source.
|
|
200
|
+
*/
|
|
201
|
+
completeness: { host_rule_files: number; source_rule_files: number; complete: boolean };
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Every host id this reading accepts, in registry order. */
|
|
205
|
+
export function hostPayloadIds(): string[] {
|
|
206
|
+
return HOST_SURFACES.map((h) => h.id);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Split a host declared projections into the standing-payload buckets.
|
|
211
|
+
*
|
|
212
|
+
* Classification is derived from the registry rather than restated: a projection
|
|
213
|
+
* ending in `/skills` is the skills catalogue, one ending in `/commands` is
|
|
214
|
+
* EXCLUDED because a command is invoked rather than standing, and whatever
|
|
215
|
+
* remains is the rules surface — a directory on the per-rule hosts, a single
|
|
216
|
+
* `.md` file on the single-surface hosts, which is also that host root
|
|
217
|
+
* instruction file.
|
|
218
|
+
*
|
|
219
|
+
* The one conditional is `claude-code`, and it is a conditional rather than a
|
|
220
|
+
* map row: the `CLAUDE.md` / `CLAUDE.local.md` pair is already declared in
|
|
221
|
+
* `PREFIX_STABLE_SURFACES` as `project-claude-md` and `project-claude-local-md`,
|
|
222
|
+
* it is that host root instruction file, and no other host reads it.
|
|
223
|
+
*/
|
|
224
|
+
export function hostPayloadRoots(hostId: string): {
|
|
225
|
+
rules: string;
|
|
226
|
+
skills: string | null;
|
|
227
|
+
claudeMd: boolean;
|
|
228
|
+
} {
|
|
229
|
+
const surface = HOST_SURFACES.find((h) => h.id === hostId);
|
|
230
|
+
if (surface === undefined) {
|
|
231
|
+
throw new Error(
|
|
232
|
+
`unknown host '${hostId}' — known ids: ${hostPayloadIds().join(', ')}. ` +
|
|
233
|
+
'The set is HOST_SURFACES in _lib/host_projection_reach.ts; a host absent there has no ' +
|
|
234
|
+
'declared projection for this reading to measure.',
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
const skills = surface.projections.find((r) => r.endsWith('/skills')) ?? null;
|
|
238
|
+
const rules = surface.projections.find(
|
|
239
|
+
(r) => !r.endsWith('/skills') && !r.endsWith('/commands'),
|
|
240
|
+
);
|
|
241
|
+
if (rules === undefined) {
|
|
242
|
+
throw new Error(
|
|
243
|
+
`host '${hostId}' declares no rules-bearing projection in HOST_SURFACES ` +
|
|
244
|
+
`(projections: ${surface.projections.join(', ') || 'none'}) — nothing to measure`,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
return { rules, skills, claudeMd: hostId === 'claude-code' };
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** Char count for one root, whether it is a rules directory or a single file. */
|
|
251
|
+
function charsAtRoot(abs: string): { chars: number; files: number } {
|
|
252
|
+
let st: fs.Stats;
|
|
253
|
+
try {
|
|
254
|
+
st = fs.statSync(abs);
|
|
255
|
+
} catch {
|
|
256
|
+
return { chars: 0, files: 0 };
|
|
257
|
+
}
|
|
258
|
+
if (st.isFile()) return { chars: fs.readFileSync(abs, 'utf-8').length, files: 1 };
|
|
259
|
+
const c = censusRuleDir(abs);
|
|
260
|
+
return { chars: c.chars, files: c.files };
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Measure the standing payload of the tree ONE host loads.
|
|
265
|
+
*
|
|
266
|
+
* `rulesDirOverride` is the low-level escape for a tree no host id names — a
|
|
267
|
+
* fixture, a consumer-shaped root, a comparison against a never-flipped tree.
|
|
268
|
+
* It is mutually exclusive with `host` at the CLI layer.
|
|
269
|
+
*/
|
|
270
|
+
export function measureHostPayload(
|
|
271
|
+
repoRoot: string,
|
|
272
|
+
opts: { host?: string; rulesDirOverride?: string },
|
|
273
|
+
): HostPayload {
|
|
274
|
+
const roots = opts.rulesDirOverride === undefined ? hostPayloadRoots(opts.host ?? '') : null;
|
|
275
|
+
const rulesRel = opts.rulesDirOverride ?? (roots as { rules: string }).rules;
|
|
276
|
+
const rulesAbs = path.isAbsolute(rulesRel) ? rulesRel : path.join(repoRoot, rulesRel);
|
|
277
|
+
if (!fs.existsSync(rulesAbs)) {
|
|
278
|
+
throw new Error(
|
|
279
|
+
`rules root '${rulesRel}' does not exist under ${repoRoot} — a host tree that was never ` +
|
|
280
|
+
'projected reads as zero tokens, which is indistinguishable from a tiny one, so this ' +
|
|
281
|
+
'refuses rather than reporting a green nothing',
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
const buckets: Array<{ name: string; tokens: number; files: number }> = [];
|
|
285
|
+
const rulesCensus = charsAtRoot(rulesAbs);
|
|
286
|
+
buckets.push({
|
|
287
|
+
name: `rules (${rulesRel})`,
|
|
288
|
+
tokens: tokens(rulesCensus.chars),
|
|
289
|
+
files: rulesCensus.files,
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
if (roots !== null && roots.skills !== null) {
|
|
293
|
+
const sk = censusSkillsCatalog(path.join(repoRoot, roots.skills));
|
|
294
|
+
buckets.push({
|
|
295
|
+
name: `skills catalog (${roots.skills})`,
|
|
296
|
+
tokens: tokens(sk.chars),
|
|
297
|
+
files: sk.skills,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
if (roots !== null && roots.claudeMd) {
|
|
301
|
+
const md = censusClaudeMdHierarchy(repoRoot, path.join(repoRoot, '.no-such-home'));
|
|
302
|
+
const chars = md.project_claude_md_chars + md.project_claude_local_md_chars;
|
|
303
|
+
const files =
|
|
304
|
+
(md.project_claude_md_present ? 1 : 0) + (md.project_claude_local_md_present ? 1 : 0);
|
|
305
|
+
buckets.push({ name: 'CLAUDE.md hierarchy (project only)', tokens: tokens(chars), files });
|
|
306
|
+
}
|
|
307
|
+
const sourceRules = censusRuleDir(path.join(repoRoot, surfaceRoot('project-scope-rules')));
|
|
308
|
+
return {
|
|
309
|
+
host: opts.rulesDirOverride === undefined ? (opts.host ?? null) : null,
|
|
310
|
+
rules_path: rulesRel,
|
|
311
|
+
buckets,
|
|
312
|
+
total: buckets.reduce((n, b) => n + b.tokens, 0),
|
|
313
|
+
completeness: {
|
|
314
|
+
host_rule_files: rulesCensus.files,
|
|
315
|
+
source_rule_files: sourceRules.files,
|
|
316
|
+
complete: rulesCensus.files >= sourceRules.files,
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
116
321
|
/**
|
|
117
322
|
* A caller-supplied ceiling, and the one direction it may go.
|
|
118
323
|
*
|
|
@@ -142,6 +347,50 @@ export function evaluate(repoRoot?: string, budgetFile?: string, overrideCeiling
|
|
|
142
347
|
return { measured, baseline: budget.baseline_tokens, ceiling, withinBudget: measured <= ceiling, buckets };
|
|
143
348
|
}
|
|
144
349
|
|
|
350
|
+
/**
|
|
351
|
+
* The measurement plus the shrink-only bound check.
|
|
352
|
+
*
|
|
353
|
+
* `evaluate` above answers "how big is the tree" and touches no ref;
|
|
354
|
+
* this answers "may this tree ship" and needs the base one. They stay separate
|
|
355
|
+
* because a census that silently depended on a remote ref would behave
|
|
356
|
+
* differently in a shallow clone, and the census is the half other callers use.
|
|
357
|
+
*/
|
|
358
|
+
export interface Decision {
|
|
359
|
+
verdict: BudgetVerdict;
|
|
360
|
+
bounds: BoundsRatchetVerdict;
|
|
361
|
+
/** False when the payload is over the ceiling, or the ceiling itself rose. */
|
|
362
|
+
ok: boolean;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export interface DecideOptions {
|
|
366
|
+
repoRoot?: string;
|
|
367
|
+
budgetFile?: string;
|
|
368
|
+
overrideCeiling?: number;
|
|
369
|
+
env?: NodeJS.ProcessEnv;
|
|
370
|
+
git?: GitRunner;
|
|
371
|
+
/** Test seam: pin the base ref instead of resolving it. `null` = none resolved. */
|
|
372
|
+
baseRef?: string | null;
|
|
373
|
+
/** Refuse instead of skipping when the shrink-only bound cannot be verified. */
|
|
374
|
+
requireBase?: boolean;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export function decide(opts: DecideOptions = {}): Decision {
|
|
378
|
+
const repoRoot = opts.repoRoot ?? REPO_ROOT;
|
|
379
|
+
const git = opts.git ?? realGit;
|
|
380
|
+
const budget = readBudget(opts.budgetFile);
|
|
381
|
+
const verdict = evaluate(repoRoot, opts.budgetFile, opts.overrideCeiling);
|
|
382
|
+
const baseRef =
|
|
383
|
+
opts.baseRef !== undefined ? opts.baseRef : resolveBaseRef(repoRoot, opts.env ?? process.env, git);
|
|
384
|
+
const bounds = assertBoundsDidNotRise({
|
|
385
|
+
repoRoot,
|
|
386
|
+
baseRef,
|
|
387
|
+
git,
|
|
388
|
+
headGraceCeiling: opts.overrideCeiling ?? budget.grace_ceiling ?? 0,
|
|
389
|
+
requireBase: opts.requireBase === true,
|
|
390
|
+
});
|
|
391
|
+
return { verdict, bounds, ok: bounds.ok && verdict.withinBudget };
|
|
392
|
+
}
|
|
393
|
+
|
|
145
394
|
/**
|
|
146
395
|
* Per-asset attribution for a refusal, against the merge-base tree.
|
|
147
396
|
*
|
|
@@ -203,6 +452,46 @@ function attributeGrowthAgainstBase(): string[] | null {
|
|
|
203
452
|
}
|
|
204
453
|
}
|
|
205
454
|
|
|
455
|
+
/** The stderr header for a refused bound. Exported so both refusals are testable. */
|
|
456
|
+
export function boundsRefusalHeader(b: BoundsRatchetVerdict): string {
|
|
457
|
+
return b.verified
|
|
458
|
+
? '❌ the standing-payload ceiling rose in this change:\n'
|
|
459
|
+
: '❌ the standing-payload ceiling could not be VERIFIED, and this run requires it:\n';
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* The bound check, rendered for a human — on BOTH paths, green and red.
|
|
464
|
+
*
|
|
465
|
+
* A check that only speaks when it fails is a check nobody audits until it is
|
|
466
|
+
* already load-bearing. Printing the compared ref and the earlier bound on the
|
|
467
|
+
* passing path is also the only way a reader can tell "verified and unchanged"
|
|
468
|
+
* from "skipped because no base ref resolved", which are different facts.
|
|
469
|
+
*
|
|
470
|
+
* THREE STATES, not two, and the third is why this was rewritten. An
|
|
471
|
+
* unverifiable bound and a risen one are both `ok: false` and need opposite
|
|
472
|
+
* actions — repair the checkout, or lower the addition. The first cut of the
|
|
473
|
+
* enforcing posture rendered both as `ROSE`, which a completion review caught:
|
|
474
|
+
* it sends an operator to shrink a rule over a fetch problem. `SKIPPED` is
|
|
475
|
+
* reserved for the ADVISORY skip, where nothing was refused at all.
|
|
476
|
+
*/
|
|
477
|
+
export function renderBounds(b: BoundsRatchetVerdict): string {
|
|
478
|
+
if (b.note !== null && b.ok) {
|
|
479
|
+
return ` ${'grace ceiling ratchet'.padEnd(38)} ${'SKIPPED'.padStart(8)} — ${b.note}\n`;
|
|
480
|
+
}
|
|
481
|
+
if (!b.verified) {
|
|
482
|
+
return (
|
|
483
|
+
` ${'grace ceiling ratchet'.padEnd(38)} ${'UNVERIFIED'.padStart(8)} — ` +
|
|
484
|
+
`${b.note ?? 'the bound could not be read'} (this run requires it)\n`
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
const base = b.baseGraceCeiling === null ? 'n/a' : String(b.baseGraceCeiling);
|
|
488
|
+
const state = b.ok ? 'ok' : 'ROSE';
|
|
489
|
+
return (
|
|
490
|
+
` ${'grace ceiling ratchet'.padEnd(38)} ${state.padStart(8)} — ` +
|
|
491
|
+
`${base} at ${b.baseRef ?? 'n/a'}, shrink-only (ADR-264)\n`
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
|
|
206
495
|
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
207
496
|
const json = argv.includes('--format=json') || argv.includes('--json');
|
|
208
497
|
// `--ceiling <n>`: the grace ceiling the CI step reads out of
|
|
@@ -211,13 +500,69 @@ export function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
211
500
|
// tighter-than-design value is IGNORED rather than honoured — see `evaluate`.
|
|
212
501
|
const ci = argv.indexOf('--ceiling');
|
|
213
502
|
const override = ci !== -1 && argv[ci + 1] !== undefined ? Number(argv[ci + 1]) : undefined;
|
|
214
|
-
|
|
503
|
+
|
|
504
|
+
// `--require-base`: refuse instead of skipping when the shrink-only bound
|
|
505
|
+
// cannot be verified. An AI council (2/2, 2026-09-10) made this blocking
|
|
506
|
+
// before the ceiling may be measured at the base ref rather than stored,
|
|
507
|
+
// because an unreadable base costs a comparison today and would grant an
|
|
508
|
+
// unbounded budget there. Opt-in rather than the default, and rather than
|
|
509
|
+
// derived from `GITHUB_ACTIONS`: a shallow clone, a first commit and a
|
|
510
|
+
// detached build all legitimately have no base, and a gate that reds on a
|
|
511
|
+
// developer's machine gets switched off.
|
|
512
|
+
const requireBase = argv.includes('--require-base');
|
|
513
|
+
|
|
514
|
+
// `--host <id>` / `--project-rules-dir <path>`: the additive host reading
|
|
515
|
+
// (AI council 2026-09-09, option 1A). Mutually exclusive on purpose — a call
|
|
516
|
+
// passing both is asking two different questions and would silently get one
|
|
517
|
+
// answer, so it is a usage error rather than a precedence rule nobody reads.
|
|
518
|
+
const hi = argv.indexOf('--host');
|
|
519
|
+
const hostArg = hi !== -1 ? argv[hi + 1] : undefined;
|
|
520
|
+
const pi = argv.indexOf('--project-rules-dir');
|
|
521
|
+
const rulesDirArg = pi !== -1 ? argv[pi + 1] : undefined;
|
|
522
|
+
if (hostArg !== undefined && rulesDirArg !== undefined) {
|
|
523
|
+
process.stderr.write(
|
|
524
|
+
'❌ preamble-payload budget: --host and --project-rules-dir are mutually exclusive. ' +
|
|
525
|
+
'Pass a host id to measure a declared projection, or a path to measure an ' +
|
|
526
|
+
'undeclared tree — never both.\n',
|
|
527
|
+
);
|
|
528
|
+
return 2;
|
|
529
|
+
}
|
|
530
|
+
if (hi !== -1 && (hostArg === undefined || hostArg.startsWith('--'))) {
|
|
531
|
+
process.stderr.write(
|
|
532
|
+
`❌ preamble-payload budget: --host needs an id — one of ${hostPayloadIds().join(', ')}.\n`,
|
|
533
|
+
);
|
|
534
|
+
return 2;
|
|
535
|
+
}
|
|
536
|
+
if (pi !== -1 && (rulesDirArg === undefined || rulesDirArg.startsWith('--'))) {
|
|
537
|
+
process.stderr.write('❌ preamble-payload budget: --project-rules-dir needs a path.\n');
|
|
538
|
+
return 2;
|
|
539
|
+
}
|
|
540
|
+
let host: HostPayload | null = null;
|
|
541
|
+
if (hostArg !== undefined || rulesDirArg !== undefined) {
|
|
542
|
+
try {
|
|
543
|
+
host = measureHostPayload(
|
|
544
|
+
REPO_ROOT,
|
|
545
|
+
hostArg !== undefined
|
|
546
|
+
? { host: hostArg }
|
|
547
|
+
: { rulesDirOverride: rulesDirArg as string },
|
|
548
|
+
);
|
|
549
|
+
} catch (err) {
|
|
550
|
+
process.stderr.write(`❌ preamble-payload budget: ${(err as Error).message}\n`);
|
|
551
|
+
return 2;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
let decision: Decision;
|
|
215
556
|
try {
|
|
216
|
-
|
|
557
|
+
decision = decide({
|
|
558
|
+
...(override === undefined ? {} : { overrideCeiling: override }),
|
|
559
|
+
requireBase,
|
|
560
|
+
});
|
|
217
561
|
} catch (err) {
|
|
218
562
|
process.stderr.write(`❌ preamble-payload budget: ${(err as Error).message}\n`);
|
|
219
563
|
return 2;
|
|
220
564
|
}
|
|
565
|
+
const verdict = decision.verdict;
|
|
221
566
|
|
|
222
567
|
// A ratchet over a measurement of nothing always passes: move
|
|
223
568
|
// `dist/agent-src/` and every census returns zero, which is trivially under
|
|
@@ -239,8 +584,37 @@ export function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
239
584
|
}
|
|
240
585
|
|
|
241
586
|
if (json) {
|
|
242
|
-
process.stdout.write(
|
|
243
|
-
|
|
587
|
+
process.stdout.write(
|
|
588
|
+
JSON.stringify(
|
|
589
|
+
{
|
|
590
|
+
...verdict,
|
|
591
|
+
// `source_corpus` and `host_payload` are structurally
|
|
592
|
+
// separate, and both seats of the 2026-09-09 council asked
|
|
593
|
+
// for exactly that: until the two are named apart, every
|
|
594
|
+
// ceiling discussion risks comparing unlike quantities. The
|
|
595
|
+
// legacy top-level fields stay so no existing reader breaks.
|
|
596
|
+
measurement_scope: host === null ? 'source-corpus' : 'source-corpus+host-payload',
|
|
597
|
+
source_corpus: {
|
|
598
|
+
measured: verdict.measured,
|
|
599
|
+
baseline: verdict.baseline,
|
|
600
|
+
ceiling: verdict.ceiling,
|
|
601
|
+
buckets: verdict.buckets,
|
|
602
|
+
},
|
|
603
|
+
host_payload: host,
|
|
604
|
+
ok: decision.ok,
|
|
605
|
+
bound_ratchet: {
|
|
606
|
+
ok: decision.bounds.ok,
|
|
607
|
+
base_ref: decision.bounds.baseRef,
|
|
608
|
+
base_grace_ceiling: decision.bounds.baseGraceCeiling,
|
|
609
|
+
note: decision.bounds.note,
|
|
610
|
+
violations: decision.bounds.violations,
|
|
611
|
+
},
|
|
612
|
+
},
|
|
613
|
+
null,
|
|
614
|
+
2,
|
|
615
|
+
) + '\n',
|
|
616
|
+
);
|
|
617
|
+
return decision.ok ? 0 : 1;
|
|
244
618
|
}
|
|
245
619
|
|
|
246
620
|
for (const b of verdict.buckets) {
|
|
@@ -252,6 +626,48 @@ export function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
252
626
|
` ${'measured total'.padEnd(38)} ${String(verdict.measured).padStart(8)} tok ` +
|
|
253
627
|
`(baseline ${verdict.baseline}, ${sign}${delta}; ceiling ${verdict.ceiling})\n`,
|
|
254
628
|
);
|
|
629
|
+
process.stdout.write(renderBounds(decision.bounds));
|
|
630
|
+
|
|
631
|
+
// The host reading prints AFTER the source verdict and never touches the
|
|
632
|
+
// exit code below. The label says which surface each number describes,
|
|
633
|
+
// because the whole defect this reading fixes was two different quantities
|
|
634
|
+
// sharing one name.
|
|
635
|
+
if (host !== null) {
|
|
636
|
+
const label = host.host === null ? host.rules_path : host.host;
|
|
637
|
+
process.stdout.write(`\n host payload — ${label} (informational, not gated)\n`);
|
|
638
|
+
for (const b of host.buckets) {
|
|
639
|
+
process.stdout.write(` ${('· ' + b.name).padEnd(38)} ${String(b.tokens).padStart(8)} tok\n`);
|
|
640
|
+
}
|
|
641
|
+
process.stdout.write(` ${'· host total'.padEnd(38)} ${String(host.total).padStart(8)} tok\n`);
|
|
642
|
+
const c = host.completeness;
|
|
643
|
+
if (!c.complete) {
|
|
644
|
+
process.stdout.write(
|
|
645
|
+
` ${'· PARTIAL TREE'.padEnd(38)} ${c.host_rule_files} rule file(s) vs ` +
|
|
646
|
+
`${c.source_rule_files} in the source.\n` +
|
|
647
|
+
' This total is NOT a consumer reading. A maintainer checkout deduplicates a\n' +
|
|
648
|
+
' project rule against the same rule at user scope, and a dev tree may hold a\n' +
|
|
649
|
+
' partial projection — both shrink this number for reasons unrelated to the\n' +
|
|
650
|
+
' projection mode. Measure a clean consumer-shaped root with\n' +
|
|
651
|
+
' --project-rules-dir <path> to get the number a consumer would load.\n',
|
|
652
|
+
);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// The bound is checked BEFORE the size question and independently of it. A
|
|
657
|
+
// change that lifts its own ceiling has already defeated the gate, and
|
|
658
|
+
// reporting that as "within budget" would be the config-weakening move
|
|
659
|
+
// wearing a green checkmark.
|
|
660
|
+
if (!decision.bounds.ok) {
|
|
661
|
+
// Two refusals, two different fixes. `verified: false` means the bound
|
|
662
|
+
// could not be READ under `--require-base`; the header must not send the
|
|
663
|
+
// reader to lower a ceiling that never moved.
|
|
664
|
+
process.stderr.write(
|
|
665
|
+
boundsRefusalHeader(decision.bounds) +
|
|
666
|
+
decision.bounds.violations.map((v) => ` · ${v}\n`).join(''),
|
|
667
|
+
);
|
|
668
|
+
return 1;
|
|
669
|
+
}
|
|
670
|
+
|
|
255
671
|
if (!verdict.withinBudget) {
|
|
256
672
|
// road-to-delivered-cost-truth 2.2 — a gate names its own "no". The
|
|
257
673
|
// ceiling message alone states a fact and leaves the reader to find the
|
|
@@ -268,8 +684,9 @@ export function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
268
684
|
process.stderr.write(
|
|
269
685
|
`❌ per-spawn preamble payload grew past the ratchet: ${verdict.measured} > ${verdict.ceiling} tok.\n` +
|
|
270
686
|
` Every rule and skill description here is re-written on EVERY subagent spawn, so growth\n` +
|
|
271
|
-
` is paid per spawn, not once.
|
|
272
|
-
`
|
|
687
|
+
` is paid per spawn, not once. Shrink the addition, or migrate the prose out of the\n` +
|
|
688
|
+
` standing rule. The grace ceiling may NOT be raised to fit it: ADR-264, enforced by\n` +
|
|
689
|
+
` the shrink-only ratchet above.\n`,
|
|
273
690
|
);
|
|
274
691
|
// Three distinct states, and conflating the last two is a diagnostic
|
|
275
692
|
// defect rather than a cosmetic one: "I could not look" and "I looked
|