@event4u/agent-config 16.2.0 → 16.4.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 +337 -234
- package/README.md +15 -13
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +11 -8
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/bug/investigate.md +1 -1
- package/dist/agent-src/commands/commit/in-chunks.md +40 -31
- package/dist/agent-src/commands/commit.md +72 -33
- package/dist/agent-src/commands/condense.md +2 -8
- package/dist/agent-src/commands/council/debate.md +11 -7
- package/dist/agent-src/commands/council/default.md +10 -9
- package/dist/agent-src/commands/council.md +1 -1
- package/dist/agent-src/commands/estimate-ticket.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +3 -3
- package/dist/agent-src/commands/feature/plan.md +2 -2
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +18 -4
- package/dist/agent-src/commands/fix/commit-messages.md +48 -23
- package/dist/agent-src/commands/fix/pr-comments.md +3 -6
- package/dist/agent-src/commands/implement-ticket.md +4 -4
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/add.md +4 -16
- package/dist/agent-src/commands/memory/load.md +5 -6
- package/dist/agent-src/commands/memory/promote.md +3 -16
- package/dist/agent-src/commands/mission/upgrade.md +3 -2
- package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
- package/dist/agent-src/commands/optimize/deep.md +4 -2
- package/dist/agent-src/commands/optimize/rtk.md +4 -26
- package/dist/agent-src/commands/pr/create/description-only.md +18 -15
- package/dist/agent-src/commands/pr/create.md +42 -34
- package/dist/agent-src/commands/pr/merge.md +136 -9
- package/dist/agent-src/commands/prepare-for-review.md +13 -11
- package/dist/agent-src/commands/project/analyze.md +7 -35
- package/dist/agent-src/commands/refine-ticket.md +1 -1
- package/dist/agent-src/commands/review/changes.md +14 -19
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +56 -42
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +411 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/commands/worktree/create.md +7 -3
- package/dist/agent-src/commands/worktree/verify.md +2 -1
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
- package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +7 -7
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
- package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
- package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +99 -54
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
- package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +95 -7
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
- package/dist/agent-src/guidelines/php/git.md +15 -2
- package/dist/agent-src/rules/active-remediation.md +1 -2
- package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
- package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
- package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -1
- package/dist/agent-src/rules/brand-consistency.md +0 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
- package/dist/agent-src/rules/broken-access-control.md +1 -1
- package/dist/agent-src/rules/cli-output-handling.md +0 -1
- package/dist/agent-src/rules/code-comment-discipline.md +0 -1
- package/dist/agent-src/rules/code-provenance.md +0 -1
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -1
- package/dist/agent-src/rules/commit-conventions.md +1 -2
- package/dist/agent-src/rules/communication-through-line.md +1 -2
- package/dist/agent-src/rules/content-quoting-floor.md +1 -2
- package/dist/agent-src/rules/context-hygiene.md +6 -6
- package/dist/agent-src/rules/copilot-routing.md +1 -2
- package/dist/agent-src/rules/council-availability.md +4 -4
- package/dist/agent-src/rules/cross-source-consistency.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +17 -35
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +12 -16
- package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
- package/dist/agent-src/rules/devcontainer-routing.md +1 -2
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/docker-commands.md +0 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/domain-safety-retention.md +1 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -1
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -2
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/fix-what-you-see.md +6 -32
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +2 -2
- package/dist/agent-src/rules/guidelines.md +0 -1
- package/dist/agent-src/rules/history-discipline.md +0 -1
- package/dist/agent-src/rules/icon-consistency.md +0 -1
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -1
- package/dist/agent-src/rules/improve-before-implement.md +0 -1
- package/dist/agent-src/rules/invite-challenge.md +0 -1
- package/dist/agent-src/rules/laravel-routing.md +1 -2
- package/dist/agent-src/rules/laravel-translations.md +0 -1
- package/dist/agent-src/rules/legal-safety-floor.md +3 -3
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +13 -17
- package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
- package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/model-recommendation.md +0 -1
- package/dist/agent-src/rules/neighbour-precedence.md +64 -0
- package/dist/agent-src/rules/no-attribution-footers.md +0 -1
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
- package/dist/agent-src/rules/no-roadmap-references.md +0 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
- package/dist/agent-src/rules/onboarding-gate.md +0 -1
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/package-ci-checks.md +0 -1
- package/dist/agent-src/rules/persona-governance.md +4 -5
- package/dist/agent-src/rules/php-coding.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
- package/dist/agent-src/rules/preservation-guard.md +0 -1
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -4
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/reviewer-awareness.md +0 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +4 -7
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -3
- package/dist/agent-src/rules/self-repair-loop.md +0 -1
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
- package/dist/agent-src/rules/session-canary.md +7 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +6 -6
- package/dist/agent-src/rules/size-enforcement.md +0 -1
- package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
- package/dist/agent-src/rules/skill-quality.md +0 -1
- package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
- package/dist/agent-src/rules/source-confidentiality.md +1 -1
- package/dist/agent-src/rules/source-discovery-gate.md +0 -1
- package/dist/agent-src/rules/source-of-truth.md +0 -1
- package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/symfony-routing.md +1 -2
- package/dist/agent-src/rules/think-before-action.md +0 -1
- package/dist/agent-src/rules/token-budget-discipline.md +12 -46
- package/dist/agent-src/rules/token-efficiency.md +0 -1
- package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
- package/dist/agent-src/rules/tool-safety.md +1 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -1
- package/dist/agent-src/rules/upstream-proposal.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -1
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -1
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
- package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
- package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
- package/dist/agent-src/skills/database/data/manifest.json +2 -2
- package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
- package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -2
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +2 -2
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +46 -129
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/roadmaps.md +6 -1
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/skill.md +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +207 -120
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-5GPULQBE.js} +2797 -338
- package/dist/cli-delegate/{chunk-IGD6ERX6.js → chunk-6SRJTYJS.js} +42 -176
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
- package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-AED2VQGM.js} +1245 -249
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/chunk-F3QDG2GT.js +2569 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-H76PHZBI.js} +149 -61
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-KXXWJTDO.js} +6 -11
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-MDPPKQCQ.js} +58 -9
- package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-MSUL5NYP.js} +5 -5
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-PWX7CKMD.js} +4 -4
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-7XGBX6ZH.js → chunk-T7XSJSUQ.js} +1144 -589
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/chunk-WQWXGIWB.js +1779 -0
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-XQTPXKFA.js} +1 -1
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- package/dist/cli-delegate/cmd_analyze_session.js +223 -43
- package/dist/cli-delegate/cmd_brand_status.js +3 -2
- package/dist/cli-delegate/cmd_conformance.js +1252 -249
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +19 -9
- package/dist/cli-delegate/cmd_doctor_neighbours.js +30 -0
- package/dist/cli-delegate/cmd_explain.js +45 -21
- package/dist/cli-delegate/cmd_export.js +13 -10
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +44 -22
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +5 -4
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +14 -11
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +10 -8
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +10 -7
- package/dist/cli-delegate/cmd_settings_check.js +54 -7
- package/dist/cli-delegate/cmd_settings_get.js +18 -8
- package/dist/cli-delegate/cmd_settings_migrate.js +13 -10
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +14 -11
- package/dist/cli-delegate/cmd_uninstall.js +15 -12
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +9 -8
- package/dist/cli-delegate/cmd_validate.js +15 -12
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +3 -3
- package/dist/cli-delegate/roadmap_gates.js +6 -6
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +232 -141
- 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 +26 -9
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +7 -4
- package/dist/hooks/dispatch.js +5655 -6623
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2336 -1249
- package/dist/install/installThinLayer.js +289 -0
- package/dist/install/installedRuleLinks.js +262 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
- package/dist/mcp/registry-manifest.json +5 -5
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +36504 -30986
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +26 -120
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/compile_time_toggles.js +12 -21
- package/dist/scripts/_lib/git_convention.js +232 -0
- package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
- package/dist/scripts/_lib/installed_layer.js +704 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/package_root.js +68 -0
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/thin_rules.js +535 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/app.js +2 -1
- package/dist/server/gitKeysGate.js +105 -0
- package/dist/server/routes/settings.js +67 -8
- package/dist/server/routes/wizard.js +4 -0
- package/dist/server/schemas/settings.js +29 -81
- package/dist/shared/skillRanking.js +103 -16
- package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +72 -1
- package/docs/contracts/settings-classes.md +39 -67
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/docs/guidelines/agent-infra/layered-settings.md +13 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
- package/docs/guidelines/php/git.md +15 -2
- package/package.json +1 -1
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/config/agent-settings.template.yml +141 -334
- package/src/config/agents-paths.yml +16 -0
- package/src/config/assurance-capability-registry.json +7 -3
- package/src/config/ci-local-parity.yml +3 -0
- package/src/config/continuity-surface.json +10 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +23 -10
- package/src/config/gate-coverage.yml +138 -3
- package/src/config/gate-violation-baselines.json +64 -16
- package/src/config/gitignore-block.txt +19 -0
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-token-budget.json +6 -1
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +67 -4
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +105 -0
- package/src/config/rule-obligations.json +833 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +378 -0
- package/src/install/installedRuleLinks.ts +308 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
- package/src/scripts/_cli/cmd_conformance.ts +13 -2
- package/src/scripts/_cli/cmd_doctor.ts +33 -81
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +426 -0
- package/src/scripts/_cli/cmd_explain.ts +72 -14
- package/src/scripts/_cli/cmd_git_convention.ts +637 -0
- package/src/scripts/_cli/cmd_settings_check.ts +66 -8
- package/src/scripts/_cli/cmd_settings_get.ts +18 -3
- package/src/scripts/_cli/doctor_execution.ts +72 -1
- package/src/scripts/_dispatch.bash +53 -4
- package/src/scripts/_lib/agent_settings.ts +26 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/git_base_ref.ts +92 -0
- package/src/scripts/_lib/git_convention.ts +291 -0
- package/src/scripts/_lib/git_convention_carrier.ts +389 -0
- package/src/scripts/_lib/git_convention_grammar.ts +246 -0
- package/src/scripts/_lib/git_convention_measure.ts +344 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +106 -0
- package/src/scripts/_lib/graph_feeder_record.ts +437 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +963 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +187 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/ratification_artifact.ts +220 -1
- package/src/scripts/_lib/ratification_subject.ts +92 -0
- package/src/scripts/_lib/release_findings_ingest.ts +15 -7
- package/src/scripts/_lib/release_highlights.ts +5 -0
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/rule_obligations.ts +205 -0
- package/src/scripts/_lib/self_repair.ts +1 -1
- package/src/scripts/_lib/settings_removed_keys.ts +173 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +620 -0
- package/src/scripts/_lib/touched_file_quality.ts +570 -0
- package/src/scripts/_lib/turn_end_refusals.ts +77 -2
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +8 -8
- package/src/scripts/ai_council/modification_review.ts +100 -0
- package/src/scripts/ai_council/modification_review_questions.ts +90 -0
- package/src/scripts/ai_council/orchestrator.ts +5 -5
- package/src/scripts/ai_council/spend_gate.ts +18 -7
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/ai_team/config.ts +11 -16
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/audit_user_type_axis.ts +20 -8
- package/src/scripts/before_complete_hook.ts +243 -12
- package/src/scripts/bench_ab_clone.ts +1 -2
- package/src/scripts/bench_concern_spawn_path.ts +129 -0
- package/src/scripts/bench_graph_feeder_latency.ts +584 -0
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/check_agent_artifact_location.ts +36 -0
- package/src/scripts/check_branch_freshness.ts +147 -24
- package/src/scripts/check_enforcement_coverage.ts +130 -0
- package/src/scripts/check_enforcement_matrix.ts +377 -20
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +196 -21
- package/src/scripts/check_gate_coverage.ts +4 -3
- package/src/scripts/check_gate_reachability.ts +48 -1
- package/src/scripts/check_generator_sync.ts +48 -0
- package/src/scripts/check_hook_bundle_composition.ts +477 -0
- package/src/scripts/check_kernel_edit_ratified.ts +132 -14
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_standing_rule_delivery.ts +129 -13
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +42 -5
- package/src/scripts/classify_merge_risk.ts +320 -0
- package/src/scripts/closure_scan.ts +91 -1
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- package/src/scripts/compile_hook_manifest.ts +33 -1
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/consumer_matrix.ts +102 -0
- package/src/scripts/context_hygiene_hook.ts +13 -23
- package/src/scripts/cost/preflight.mjs +12 -1
- package/src/scripts/council_cli.ts +7 -7
- package/src/scripts/dispatch_r2_reviewer.ts +24 -11
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +21 -4
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +175 -15
- package/src/scripts/hooks/block_config_weakening.ts +115 -7
- package/src/scripts/hooks/block_plumbing_writes.ts +37 -5
- package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/dispatch_hook.ts +52 -52
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- package/src/scripts/hooks/exit_codes.ts +2 -1
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.ts +19 -1
- package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
- package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +795 -60
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/table_fingerprint.ts +21 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +24 -7
- package/src/scripts/hooks/turn_end_gate_hook.ts +85 -0
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +78 -215
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_blocker_citations.ts +198 -0
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- package/src/scripts/lint_hook_manifest.ts +53 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +465 -29
- package/src/scripts/lint_roadmap_blockers.ts +282 -29
- package/src/scripts/lint_roadmap_complexity.ts +4 -2
- package/src/scripts/lint_rule_law_section.ts +647 -0
- package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
- package/src/scripts/lint_settings_classes.ts +1 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
- package/src/scripts/lint_workflow_security.ts +173 -6
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +221 -8
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/model_rule_injection.ts +55 -8
- package/src/scripts/onboarding_gate_hook.ts +7 -6
- package/src/scripts/print_required_checks.ts +15 -3
- package/src/scripts/probe_host_compliance.ts +33 -5
- package/src/scripts/probe_turnaround.ts +183 -3
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/ratification_header.ts +77 -0
- package/src/scripts/refusal_envelope.ts +138 -0
- package/src/scripts/release_publication.ts +29 -3
- package/src/scripts/report_dispatch_import_closure.ts +76 -0
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +274 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +228 -0
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_ranker_confusion.ts +543 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/routing_doctor.ts +2 -2
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/review-findings.schema.json +3 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +101 -9
- package/src/scripts/skill_tools/score_skill_relevance.ts +314 -40
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -21
- package/src/server/schemas/settings.ts +42 -176
- package/src/shared/skillRanking.ts +169 -14
- package/dist/cli-delegate/chunk-5R7HOLAF.js +0 -99
- package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/src/scripts/_lib/config_chain.ts +0 -477
- package/src/scripts/_lib/conformance_report.ts +0 -403
- package/src/scripts/_lib/eval_discrimination.ts +0 -95
- package/src/scripts/_lib/evaluator_promotion.ts +0 -225
- package/src/scripts/_lib/file_slicer.ts +0 -117
- package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
- package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
- package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
- package/src/scripts/_lib/role_split.ts +0 -338
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The windsurf single-file surface, rendered — one renderer, two callers.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-a-hook-bundle-with-one-yaml-reader` 3.1. `condense.generate_windsurfrules`
|
|
5
|
+
* WRITES `.windsurfrules`; the standing-payload census needs the same bytes to
|
|
6
|
+
* report windsurf's figure without reading that file, because it is an untracked
|
|
7
|
+
* generated projection and reading it published a number that tracked when the
|
|
8
|
+
* checkout last ran `task generate-tools` rather than anything about the tree.
|
|
9
|
+
*
|
|
10
|
+
* Both callers share THIS function. A second renderer living in the census would
|
|
11
|
+
* have measured a file nobody receives, which is Risk 3 of that roadmap.
|
|
12
|
+
*
|
|
13
|
+
* WHY A SEPARATE MODULE rather than an export from `condense.ts`: that file sits
|
|
14
|
+
* 1,228 lines over the 1,500-line cap `check_source_size_budget` ratchets, so
|
|
15
|
+
* every line added there is a new violation. Splitting the renderer out moves
|
|
16
|
+
* `condense.ts` DOWN. The file is small on purpose and carries only what the
|
|
17
|
+
* render needs.
|
|
18
|
+
*
|
|
19
|
+
* `strip_frontmatter` moved here with it — it is the render's one non-trivial
|
|
20
|
+
* dependency, it has exactly one caller left inside `condense.ts`, and leaving it
|
|
21
|
+
* behind would have meant either an import cycle or a second copy.
|
|
22
|
+
* `condense.ts` re-exports it, so `src/install/emit_host_rules_cli.ts` and every
|
|
23
|
+
* other importer keeps its path.
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from 'node:fs';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
|
|
28
|
+
/** Python `str.lstrip("\n")` — strip only leading newlines. Mirrors `condense._lstripNewlines`. */
|
|
29
|
+
function lstripNewlines(s: string): string {
|
|
30
|
+
return s.replace(/^\n+/, '');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Python `str.strip()` with no args — strip leading/trailing Unicode whitespace. Mirrors `condense._strip`. */
|
|
34
|
+
function strip(s: string): string {
|
|
35
|
+
return s.replace(/^\s+/u, '').replace(/\s+$/u, '');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Drop a leading `---` frontmatter block, if the content opens with one. */
|
|
39
|
+
export function strip_frontmatter(content: string): string {
|
|
40
|
+
if (content.startsWith('---')) {
|
|
41
|
+
const end = content.indexOf('---', 3);
|
|
42
|
+
if (end !== -1) {
|
|
43
|
+
content = lstripNewlines(content.slice(end + 3));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return content;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The exact bytes `generate_windsurfrules` writes, for a given rule set.
|
|
51
|
+
*
|
|
52
|
+
* `rulesSource` is a parameter rather than `condense.MODULE_STATE.RULES_SOURCE`
|
|
53
|
+
* so a caller can render a tree it names — the census renders the projection
|
|
54
|
+
* source directly, with no module state to set up.
|
|
55
|
+
*/
|
|
56
|
+
export function render_windsurfrules(rulesSource: string, rules: readonly string[]): string {
|
|
57
|
+
const parts = ['# Auto-generated from dist/agent-src/rules/ — do not edit directly\n'];
|
|
58
|
+
for (const rule of rules) {
|
|
59
|
+
const content = strip_frontmatter(fs.readFileSync(path.join(rulesSource, rule), 'utf-8'));
|
|
60
|
+
parts.push(`---\n\n${strip(content)}\n`);
|
|
61
|
+
}
|
|
62
|
+
return parts.join('\n') + '\n';
|
|
63
|
+
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* error on the wrong rung, not diligence.
|
|
10
10
|
*
|
|
11
11
|
* Composes with — replaces nothing:
|
|
12
|
-
* - the
|
|
12
|
+
* - the `execution.fix_loop_max` validation-loop budget (`autonomous-execution`),
|
|
13
13
|
* - the ADR-109 / `subagent-response-contract` body + 4-status envelope
|
|
14
14
|
* (`subagent-steering`): the partial result rides as the body of a
|
|
15
15
|
* `BLOCKED` envelope with `budget_hit: true` as the escalation flag.
|
|
@@ -187,11 +187,26 @@ export function scan(d: string): [Row[], Row[], string[]] {
|
|
|
187
187
|
* A scope with no refs renders as `—`: a qualifier on nothing is not a
|
|
188
188
|
* supersession, and printing the prose alone would read as one.
|
|
189
189
|
*/
|
|
190
|
+
/**
|
|
191
|
+
* Escape a `|` for safety inside a Markdown table cell. The free-text scope
|
|
192
|
+
* fields this feeds (`supersedes_scope` / `superseded_scope`) routinely quote
|
|
193
|
+
* a table row from the record they describe — and a quoted row has its own
|
|
194
|
+
* `|` column separators, verbatim, in the frontmatter prose. Unescaped, that
|
|
195
|
+
* splits the generated row into extra columns rather than rendering the quote
|
|
196
|
+
* (found live in ADR-230's and ADR-279's own rows, both quoting the same
|
|
197
|
+
* table cell from ADR-230 § Decision). `refs` itself is never escaped: it is
|
|
198
|
+
* always an `ADR-NNN` token list this generator produces or validates, never
|
|
199
|
+
* free text.
|
|
200
|
+
*/
|
|
201
|
+
function escapeCell(text: string): string {
|
|
202
|
+
return text.replaceAll('|', '\\|');
|
|
203
|
+
}
|
|
204
|
+
|
|
190
205
|
export function supersessionCell(refs: string | undefined, scope: string | undefined): string {
|
|
191
206
|
const r = (refs ?? '').trim();
|
|
192
207
|
if (r === '' || r === '—') return '—';
|
|
193
208
|
const s = (scope ?? '').trim();
|
|
194
|
-
return s === '' || s === '—' ? r : `${r} (${s})`;
|
|
209
|
+
return s === '' || s === '—' ? r : `${r} (${escapeCell(s)})`;
|
|
195
210
|
}
|
|
196
211
|
|
|
197
212
|
/** Mirror `row(r)`. */
|
|
@@ -29,15 +29,23 @@ import * as path from 'node:path';
|
|
|
29
29
|
export const CLI_CALLS_ATTRIBUTION_SUFFIX = '.attribution.json';
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
* Who booked a call. Enumerated because the consumer set is closed: exactly
|
|
33
|
-
* files in the tree construct a `CliClient`.
|
|
32
|
+
* Who booked a call. Enumerated because the consumer set is closed: exactly
|
|
33
|
+
* three files in the tree construct a `CliClient`.
|
|
34
34
|
*
|
|
35
|
-
* `unknown` is a FINDING when it appears — it means a
|
|
36
|
-
*
|
|
37
|
-
*
|
|
35
|
+
* `unknown` is a FINDING when it appears — it means a booking path exists that
|
|
36
|
+
* this enumeration does not know about. That is how the test suite was caught
|
|
37
|
+
* spending the operator's live budget.
|
|
38
38
|
*/
|
|
39
39
|
export const CLI_CONSUMER_COUNCIL = 'council';
|
|
40
40
|
export const CLI_CONSUMER_TEAM = 'team';
|
|
41
|
+
/**
|
|
42
|
+
* The dogfooded self-review gate. Third because `self_review_gate.ts` is
|
|
43
|
+
* CLI-first since this constant was added: the subscription transport is tried
|
|
44
|
+
* before the API one, so a local or self-hosted run books here rather than
|
|
45
|
+
* spending API credit. A hosted CI runner has no vendor CLI on PATH and falls
|
|
46
|
+
* through to the API transport, which books nothing against this counter.
|
|
47
|
+
*/
|
|
48
|
+
export const CLI_CONSUMER_SELF_REVIEW = 'self-review';
|
|
41
49
|
export const CLI_CONSUMER_UNKNOWN = 'unknown';
|
|
42
50
|
|
|
43
51
|
/**
|
|
@@ -88,6 +88,7 @@ import * as user_global_paths from '../_lib/user_global_paths.js';
|
|
|
88
88
|
import { jsonDumpsIndent2 as _jsonDumpsIndent2 } from './_py_json.js';
|
|
89
89
|
import * as budget from './cli_call_budget.js';
|
|
90
90
|
import { appendEvent } from './events_log.js';
|
|
91
|
+
import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
|
|
91
92
|
|
|
92
93
|
export const ANTHROPIC_KEY_FILENAME = 'anthropic.key';
|
|
93
94
|
export const OPENAI_KEY_FILENAME = 'openai.key';
|
|
@@ -124,23 +125,12 @@ export const DEFAULT_PERPLEXITY_MODEL = 'sonar-pro';
|
|
|
124
125
|
// divergence is a one-line change, not a hunt through inline literals.
|
|
125
126
|
// (`xai` / `perplexity` CLI reuse their API constants: their CLIs are
|
|
126
127
|
// community wrappers around the same paid API, so the values do not diverge.)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
* `400 invalid_request_error: The '<model>' model is not supported when using
|
|
134
|
-
* Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
|
|
135
|
-
* value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
|
|
136
|
-
*
|
|
137
|
-
* So the only value known to work on this transport is "whatever the CLI
|
|
138
|
-
* chooses", and pinning ANY name here would re-break the seat the next time
|
|
139
|
-
* the vendor rotates its lineup. The label is carried into records as-is so a
|
|
140
|
-
* reader can see that no model was pinned, rather than a name being implied
|
|
141
|
-
* that nobody verified.
|
|
142
|
-
*/
|
|
143
|
-
export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';
|
|
128
|
+
// `OPENAI_CLI_VENDOR_DEFAULT` lives in `vendor_defaults.ts`, re-exported here
|
|
129
|
+
// so every existing importer keeps resolving. It moved because `config.ts`
|
|
130
|
+
// wanted that one string and was charged this whole module for it in the
|
|
131
|
+
// composed hook bundle — 51,523 bytes on every dispatch; the reasoning and the
|
|
132
|
+
// measurement are in that file's header.
|
|
133
|
+
export { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
|
|
144
134
|
|
|
145
135
|
/**
|
|
146
136
|
* Models MEASURED to be refused by the codex subscription transport, with the
|
|
@@ -1011,6 +1001,7 @@ export const CLI_CALLS_FILENAME = 'cli-calls.json';
|
|
|
1011
1001
|
export {
|
|
1012
1002
|
CLI_CALLS_ATTRIBUTION_SUFFIX,
|
|
1013
1003
|
CLI_CONSUMER_COUNCIL,
|
|
1004
|
+
CLI_CONSUMER_SELF_REVIEW,
|
|
1014
1005
|
CLI_CONSUMER_TEAM,
|
|
1015
1006
|
CLI_CONSUMER_UNKNOWN,
|
|
1016
1007
|
QUOTA_SOURCE_LOCAL_BUDGET,
|
|
@@ -1678,16 +1669,22 @@ export function _foldSystemPrompt(system_prompt: string, user_prompt: string): s
|
|
|
1678
1669
|
export class AnthropicCliClient extends CliClient {
|
|
1679
1670
|
override subscription_label = 'claude-pro';
|
|
1680
1671
|
|
|
1672
|
+
// `...opts` rather than a field list, in all five CLI subclasses, and the
|
|
1673
|
+
// spread IS the fix rather than a tidy. Each of these constructors used to
|
|
1674
|
+
// name six option fields explicitly and forward those — so when
|
|
1675
|
+
// `CliClientOptions` grew a seventh, `consumer`, every subclass silently
|
|
1676
|
+
// dropped it. Both construction sites passed it, `CliClient` read
|
|
1677
|
+
// `opts.consumer ?? CLI_CONSUMER_UNKNOWN`, and the sidecar recorded
|
|
1678
|
+
// `unknown` for every CLI call ever booked: measured 2026-10-05 as
|
|
1679
|
+
// `{"anthropic":{"unknown":2},"openai":{"unknown":2}}` after a council
|
|
1680
|
+
// round. A field list can forget a field. A spread cannot, so the eighth
|
|
1681
|
+
// option needs no edit here and cannot repeat this.
|
|
1682
|
+
//
|
|
1683
|
+
// `model` stays explicit because it is the one field each subclass
|
|
1684
|
+
// overrides with its own pinned default; everything else passes through.
|
|
1681
1685
|
constructor(opts: CliClientOptions = {}) {
|
|
1682
1686
|
super(
|
|
1683
|
-
{
|
|
1684
|
-
model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL,
|
|
1685
|
-
binary: opts.binary,
|
|
1686
|
-
timeout_seconds: opts.timeout_seconds,
|
|
1687
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
1688
|
-
warn_at: opts.warn_at,
|
|
1689
|
-
cli_calls_path: opts.cli_calls_path,
|
|
1690
|
-
},
|
|
1687
|
+
{ ...opts, model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL },
|
|
1691
1688
|
{ name: 'anthropic', default_binary: 'claude' },
|
|
1692
1689
|
);
|
|
1693
1690
|
}
|
|
@@ -1817,14 +1814,7 @@ export class OpenAICliClient extends CliClient {
|
|
|
1817
1814
|
|
|
1818
1815
|
constructor(opts: CliClientOptions = {}) {
|
|
1819
1816
|
super(
|
|
1820
|
-
{
|
|
1821
|
-
model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL,
|
|
1822
|
-
binary: opts.binary,
|
|
1823
|
-
timeout_seconds: opts.timeout_seconds,
|
|
1824
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
1825
|
-
warn_at: opts.warn_at,
|
|
1826
|
-
cli_calls_path: opts.cli_calls_path,
|
|
1827
|
-
},
|
|
1817
|
+
{ ...opts, model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL },
|
|
1828
1818
|
{ name: 'openai', default_binary: 'codex' },
|
|
1829
1819
|
);
|
|
1830
1820
|
}
|
|
@@ -2064,14 +2054,7 @@ export class GeminiCliClient extends CliClient {
|
|
|
2064
2054
|
|
|
2065
2055
|
constructor(opts: CliClientOptions = {}) {
|
|
2066
2056
|
super(
|
|
2067
|
-
{
|
|
2068
|
-
model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL,
|
|
2069
|
-
binary: opts.binary,
|
|
2070
|
-
timeout_seconds: opts.timeout_seconds,
|
|
2071
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
2072
|
-
warn_at: opts.warn_at,
|
|
2073
|
-
cli_calls_path: opts.cli_calls_path,
|
|
2074
|
-
},
|
|
2057
|
+
{ ...opts, model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL },
|
|
2075
2058
|
{ name: 'gemini', default_binary: 'gemini' },
|
|
2076
2059
|
);
|
|
2077
2060
|
}
|
|
@@ -2217,14 +2200,7 @@ export class XAICliClient extends CliClient {
|
|
|
2217
2200
|
|
|
2218
2201
|
constructor(opts: CliClientOptions = {}) {
|
|
2219
2202
|
super(
|
|
2220
|
-
{
|
|
2221
|
-
model: opts.model ?? DEFAULT_XAI_MODEL,
|
|
2222
|
-
binary: opts.binary,
|
|
2223
|
-
timeout_seconds: opts.timeout_seconds,
|
|
2224
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
2225
|
-
warn_at: opts.warn_at,
|
|
2226
|
-
cli_calls_path: opts.cli_calls_path,
|
|
2227
|
-
},
|
|
2203
|
+
{ ...opts, model: opts.model ?? DEFAULT_XAI_MODEL },
|
|
2228
2204
|
{ name: 'xai', default_binary: 'grok' },
|
|
2229
2205
|
);
|
|
2230
2206
|
}
|
|
@@ -2289,14 +2265,7 @@ export class PerplexityCliClient extends CliClient {
|
|
|
2289
2265
|
|
|
2290
2266
|
constructor(opts: CliClientOptions = {}) {
|
|
2291
2267
|
super(
|
|
2292
|
-
{
|
|
2293
|
-
model: opts.model ?? DEFAULT_PERPLEXITY_MODEL,
|
|
2294
|
-
binary: opts.binary,
|
|
2295
|
-
timeout_seconds: opts.timeout_seconds,
|
|
2296
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
2297
|
-
warn_at: opts.warn_at,
|
|
2298
|
-
cli_calls_path: opts.cli_calls_path,
|
|
2299
|
-
},
|
|
2268
|
+
{ ...opts, model: opts.model ?? DEFAULT_PERPLEXITY_MODEL },
|
|
2300
2269
|
{ name: 'perplexity', default_binary: 'perplexity' },
|
|
2301
2270
|
);
|
|
2302
2271
|
}
|
|
@@ -82,7 +82,7 @@ import * as budget from './cli_call_budget.js';
|
|
|
82
82
|
// `import type` and is erased at build, so there is no runtime cycle today.
|
|
83
83
|
// Converting it to a value import — or adding any other runtime import from
|
|
84
84
|
// quorum into config — creates a real ESM cycle in the loader's init path.
|
|
85
|
-
import { OPENAI_CLI_VENDOR_DEFAULT } from './
|
|
85
|
+
import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
|
|
86
86
|
import { parseSeatFields, type PolicyExclusion } from './seat_policy.js';
|
|
87
87
|
import type { ContentClass } from './content_ceiling.js';
|
|
88
88
|
import { SOLO_FLOOR_MIN_PRESENT } from './quorum.js';
|
|
@@ -291,8 +291,8 @@ export interface CostBudgetConfig {
|
|
|
291
291
|
readonly max_output_tokens: number;
|
|
292
292
|
readonly max_calls: number;
|
|
293
293
|
readonly max_total_usd: number;
|
|
294
|
-
/** Rolling 24h cap. 0 disables it
|
|
295
|
-
*
|
|
294
|
+
/** Rolling 24h cap. 0 disables it. The spend ledger is written either way
|
|
295
|
+
* (ADR-279); this value decides only whether the total is compared. */
|
|
296
296
|
readonly daily_limit_usd: number;
|
|
297
297
|
}
|
|
298
298
|
|
|
@@ -1020,7 +1020,7 @@ function _build_debate(d: Dict): DebateConfig {
|
|
|
1020
1020
|
if (!_isDict(d)) {
|
|
1021
1021
|
throw new CouncilConfigError('`debate` must be a mapping.');
|
|
1022
1022
|
}
|
|
1023
|
-
const cap = _pyFloat(_get(d, 'max_cost_usd',
|
|
1023
|
+
const cap = _pyFloat(_get(d, 'max_cost_usd', 0.0)); // 0 = no refusal cap (ADR-279)
|
|
1024
1024
|
if (cap < 0) {
|
|
1025
1025
|
throw new CouncilConfigError(
|
|
1026
1026
|
`debate.max_cost_usd must be >= 0 (got ${_pyRepr(_f(cap))}; ` +
|
|
@@ -1671,10 +1671,10 @@ function _build_cost_budget(d: Dict): CostBudgetConfig {
|
|
|
1671
1671
|
throw new CouncilConfigError('`cost_budget` must be a mapping.');
|
|
1672
1672
|
}
|
|
1673
1673
|
const cb: CostBudgetConfig = {
|
|
1674
|
-
max_input_tokens: _pyInt(_get(d, 'max_input_tokens',
|
|
1675
|
-
max_output_tokens: _pyInt(_get(d, 'max_output_tokens',
|
|
1676
|
-
max_calls: _pyInt(_get(d, 'max_calls', 50)),
|
|
1677
|
-
max_total_usd: _pyFloat(_get(d, 'max_total_usd',
|
|
1674
|
+
max_input_tokens: _pyInt(_get(d, 'max_input_tokens', 0)), // 0 = unbounded (ADR-279)
|
|
1675
|
+
max_output_tokens: _pyInt(_get(d, 'max_output_tokens', 0)), // 0 = unbounded (ADR-279)
|
|
1676
|
+
max_calls: _pyInt(_get(d, 'max_calls', 50)), // fan-out, not money — kept
|
|
1677
|
+
max_total_usd: _pyFloat(_get(d, 'max_total_usd', 0.0)), // 0 = unbounded (ADR-279)
|
|
1678
1678
|
daily_limit_usd: _pyFloat(_get(d, 'daily_limit_usd', 0.0)),
|
|
1679
1679
|
};
|
|
1680
1680
|
const fields: Array<[keyof CostBudgetConfig, boolean]> = [
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* modification_review — the review verb for a diff whose bundle contains a
|
|
3
|
+
* gated path: how a seat closes, and how the record's verdict follows.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-self-modification-that-a-council-must-pass` steps 3.2 and 3.3.
|
|
6
|
+
*
|
|
7
|
+
* WHY THE EXISTING STANCE PARSER AND NOT A NEW ONE. Seats already close on a
|
|
8
|
+
* `STANCE: … | CONFIDENCE: … | DEALBREAKER: …` line, and `stance_tally` already
|
|
9
|
+
* parses it — including the two cosmetic defects it forgives. A second grammar
|
|
10
|
+
* for the same closing line would be a second thing to keep in step with the
|
|
11
|
+
* prompt, and the first time they diverged a seat's verdict would be read by
|
|
12
|
+
* one and dropped by the other.
|
|
13
|
+
*
|
|
14
|
+
* WHAT IS DELIBERATELY NOT USED. Not the option tally, and not the synthesis
|
|
15
|
+
* verdict line. Both answer which OPTION wins a deliberation; this review asks
|
|
16
|
+
* whether each SEAT passed a change, which is a different question over the
|
|
17
|
+
* same replies. Nor is the diff lens's own closing line asked for — a lens is
|
|
18
|
+
* not a seat.
|
|
19
|
+
*
|
|
20
|
+
* WHY A VERB OF ITS OWN HERE RATHER THAN AN `agent-config` COMMAND. The CLI
|
|
21
|
+
* help-count budget is at its maximum (`cli_help_command_count` in
|
|
22
|
+
* `src/config/evaluator-budgets.json`), so a new top-level verb would spend a
|
|
23
|
+
* ratchet this change has no claim on. It dispatches inside `council_cli`.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { parse_stance_line } from './stance_tally.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The closed vocabulary a seat may close on. Open it and a grep for a passing
|
|
30
|
+
* verdict starts reading words nobody adjudicated — the failure
|
|
31
|
+
* `ratification-artifact.md` names for its own `verdict` field.
|
|
32
|
+
*/
|
|
33
|
+
export const MODIFICATION_VERDICT_LABELS = [
|
|
34
|
+
'ratified',
|
|
35
|
+
'confirmed-non-expanding',
|
|
36
|
+
'refused',
|
|
37
|
+
] as const;
|
|
38
|
+
|
|
39
|
+
export type ModificationVerdictLabel = (typeof MODIFICATION_VERDICT_LABELS)[number];
|
|
40
|
+
|
|
41
|
+
/** The record's verdict: a seat label, or the one value no seat may utter. */
|
|
42
|
+
export type ModificationVerdict = ModificationVerdictLabel | 'non-convergent';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Read ONE seat's reply. Returns its label when the seat concluded, `null`
|
|
46
|
+
* otherwise — a missing line, an abstention, or any other label.
|
|
47
|
+
*
|
|
48
|
+
* `null` is never inferred from surrounding prose: a seat that writes
|
|
49
|
+
* "I would call this ratified" has not closed on a stance line, and reading it
|
|
50
|
+
* as a conclusion is how a review starts reporting verdicts nobody gave.
|
|
51
|
+
*/
|
|
52
|
+
export function seatConclusion(text: string): ModificationVerdictLabel | null {
|
|
53
|
+
const line = parse_stance_line(text);
|
|
54
|
+
if (line === null) return null;
|
|
55
|
+
const label = line.label.trim().toLowerCase();
|
|
56
|
+
return (MODIFICATION_VERDICT_LABELS as readonly string[]).includes(label)
|
|
57
|
+
? (label as ModificationVerdictLabel)
|
|
58
|
+
: null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Read every seat, keeping the non-concluding ones present and `null` rather
|
|
63
|
+
* than dropping them. A dropped seat is indistinguishable from a seat that was
|
|
64
|
+
* never asked, and the quorum rule below has to tell those apart.
|
|
65
|
+
*/
|
|
66
|
+
export function readSeatConclusions(
|
|
67
|
+
replies: Readonly<Record<string, string>>,
|
|
68
|
+
): Record<string, ModificationVerdictLabel | null> {
|
|
69
|
+
const out: Record<string, ModificationVerdictLabel | null> = {};
|
|
70
|
+
for (const [seat, text] of Object.entries(replies)) {
|
|
71
|
+
out[seat] = seatConclusion(text);
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Derive the record's verdict. ONE rule, and the ORDER is the rule:
|
|
78
|
+
*
|
|
79
|
+
* 1. any concluding seat on `refused` → `refused`
|
|
80
|
+
* 2. concluding providers < required → `non-convergent`
|
|
81
|
+
* 3. any concluding seat on `ratified` → `ratified`
|
|
82
|
+
* 4. otherwise (all concluded, all non-expanding) → `confirmed-non-expanding`
|
|
83
|
+
*
|
|
84
|
+
* Step 1 precedes step 2 on purpose. A single refusing seat is a refusal even
|
|
85
|
+
* when it is the only seat that concluded: letting the quorum rule fire first
|
|
86
|
+
* would turn "one reviewer said no" into "not enough reviewers answered", which
|
|
87
|
+
* reads as a retryable condition rather than as the objection it is.
|
|
88
|
+
*/
|
|
89
|
+
export function deriveModificationVerdict(
|
|
90
|
+
seats: Readonly<Record<string, ModificationVerdictLabel | null>>,
|
|
91
|
+
requiredProviders: number,
|
|
92
|
+
): ModificationVerdict {
|
|
93
|
+
const concluded = Object.values(seats).filter(
|
|
94
|
+
(v): v is ModificationVerdictLabel => v !== null,
|
|
95
|
+
);
|
|
96
|
+
if (concluded.includes('refused')) return 'refused';
|
|
97
|
+
if (concluded.length < requiredProviders) return 'non-convergent';
|
|
98
|
+
if (concluded.includes('ratified')) return 'ratified';
|
|
99
|
+
return 'confirmed-non-expanding';
|
|
100
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* modification_review_questions — the fixed set a modification review asks
|
|
3
|
+
* every seat, one by one.
|
|
4
|
+
*
|
|
5
|
+
* `road-to-self-modification-that-a-council-must-pass` step 3.1. The owner's
|
|
6
|
+
* directive of 2026-10-05 is that self-modification is a goal, confirmed by a
|
|
7
|
+
* council that "always questions critically and checks what the modification
|
|
8
|
+
* does". A council that is merely ASKED for an opinion produces an opinion; a
|
|
9
|
+
* council handed a fixed list answers the same nine things about every change,
|
|
10
|
+
* and a reader can tell which one a seat skipped.
|
|
11
|
+
*
|
|
12
|
+
* WHY A CONSTANT RATHER THAN PROSE IN A PROMPT. The list is the review's
|
|
13
|
+
* contract, so it is quoted in `docs/contracts/ratification-artifact.md` and
|
|
14
|
+
* read from here by whatever renders the prompt. One definition, two readers —
|
|
15
|
+
* the alternative is a prompt and a contract that drift apart silently, which
|
|
16
|
+
* is the drift this package's own gates exist to catch.
|
|
17
|
+
*
|
|
18
|
+
* WHERE THE TREE ALREADY WORDS A QUESTION, THAT WORDING IS USED rather than
|
|
19
|
+
* paraphrased. Two do: `evaluator-independence`'s weakening clause and the
|
|
20
|
+
* synthesis prompt's kill-switch criteria. A paraphrase would be a second,
|
|
21
|
+
* slightly different standard for the same thing — and each carries a `source`
|
|
22
|
+
* so a reader can check the borrow rather than take it.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/** One question, addressable on its own so a skipped answer is visible. */
|
|
26
|
+
export interface ModificationReviewQuestion {
|
|
27
|
+
/** Stable id; the record's body keys each seat's answer by it. */
|
|
28
|
+
readonly id: string;
|
|
29
|
+
/** The question as asked, verbatim. */
|
|
30
|
+
readonly text: string;
|
|
31
|
+
/** Where the wording came from, when it was taken rather than written. */
|
|
32
|
+
readonly source?: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The nine, in the order step 3.1 enumerates them. Order is part of the
|
|
37
|
+
* contract: a seat answering one by one answers them in this sequence, so a
|
|
38
|
+
* record can be read against the list without matching prose to intent.
|
|
39
|
+
*/
|
|
40
|
+
export const MODIFICATION_REVIEW_QUESTIONS: readonly ModificationReviewQuestion[] = [
|
|
41
|
+
{
|
|
42
|
+
id: 'behaviour-change',
|
|
43
|
+
text: 'What behaviour changes, including what follows from it that the diff does not state?',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: 'boundary-direction',
|
|
47
|
+
text: 'Which authority or safety boundary becomes wider or narrower, and in which direction?',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'weakens-its-own-judge',
|
|
51
|
+
text:
|
|
52
|
+
'Does the change weaken anything that judges it — a test, a gate, a threshold, this review? ' +
|
|
53
|
+
'The standard is quoted rather than paraphrased: the implementer never silently ' +
|
|
54
|
+
'weakens an assertion, deletes, skips or xfails a failing test, lowers a threshold, ' +
|
|
55
|
+
'or changes fixture semantics to fit the code. Does this change do any of those?',
|
|
56
|
+
source: 'src/rules/evaluator-independence.md § Tests are evaluators',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'route-around',
|
|
60
|
+
text: 'Is another host or projection left as a way around the control this change touches?',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'undo',
|
|
64
|
+
text: 'Can it be undone, and how — by whom, with what authority, and against which revision?',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: 'falsifier',
|
|
68
|
+
text:
|
|
69
|
+
'What observation would show the claimed benefit to be false, and what rollback / ' +
|
|
70
|
+
'kill-switch criteria does the change omit?',
|
|
71
|
+
source: 'src/scripts/ai_council/prompts.ts (DESIGN_MODE, ROADMAP_MODE)',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'smaller-change',
|
|
75
|
+
text: 'Would a smaller change do, and what does the larger one buy that the smaller one does not?',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'instruction-weight',
|
|
79
|
+
text: 'What does it add to standing instruction weight that every later session pays?',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: 'untrusted-steering',
|
|
83
|
+
text: 'Could untrusted content steer the path this change opens, and what bounds it if so?',
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
/** The list as a seat sees it: numbered, in order, nothing dropped. */
|
|
88
|
+
export function renderModificationReviewQuestions(): string {
|
|
89
|
+
return MODIFICATION_REVIEW_QUESTIONS.map((q, i) => `${i + 1}. ${q.text}`).join('\n');
|
|
90
|
+
}
|
|
@@ -412,7 +412,7 @@ export function consult(
|
|
|
412
412
|
return [];
|
|
413
413
|
}
|
|
414
414
|
const resolvedBudget = budget ?? new CostBudget();
|
|
415
|
-
if (members.length > resolvedBudget.max_calls) {
|
|
415
|
+
if (resolvedBudget.max_calls > 0 && members.length > resolvedBudget.max_calls) {
|
|
416
416
|
throw new Error(
|
|
417
417
|
`Council has ${members.length} members but budget caps at ` +
|
|
418
418
|
`${resolvedBudget.max_calls} calls.`,
|
|
@@ -802,9 +802,9 @@ function _run_round(
|
|
|
802
802
|
);
|
|
803
803
|
actual_usd = _total_usd(actual);
|
|
804
804
|
spent.usd += _total_usd(actual);
|
|
805
|
-
//
|
|
806
|
-
//
|
|
807
|
-
if (
|
|
805
|
+
// Ledger every billable response, bounded or not (ADR-279): a cap
|
|
806
|
+
// decides whether the total is compared, never whether it is kept.
|
|
807
|
+
if (!response.error) {
|
|
808
808
|
_record_daily_spend(_total_usd(actual), effective.name, effective.model, {
|
|
809
809
|
cache_read_input_tokens: response.cache_read_input_tokens,
|
|
810
810
|
cache_creation_input_tokens: response.cache_creation_input_tokens,
|
|
@@ -1246,7 +1246,7 @@ export function run_debate(
|
|
|
1246
1246
|
return [];
|
|
1247
1247
|
}
|
|
1248
1248
|
const budget = budget0 ?? new CostBudget();
|
|
1249
|
-
if (members.length > budget.max_calls) {
|
|
1249
|
+
if (budget.max_calls > 0 && members.length > budget.max_calls) {
|
|
1250
1250
|
throw new Error(
|
|
1251
1251
|
`Debate has ${members.length} members but budget caps at ` +
|
|
1252
1252
|
`${budget.max_calls} calls.`,
|
|
@@ -20,9 +20,9 @@ import type { ExternalAIClient } from './clients.js';
|
|
|
20
20
|
import { would_exceed as _would_exceed_daily } from './budget_guard.js';
|
|
21
21
|
|
|
22
22
|
export class CostBudget {
|
|
23
|
-
max_input_tokens: number;
|
|
24
|
-
max_output_tokens: number;
|
|
25
|
-
max_calls: number;
|
|
23
|
+
max_input_tokens: number; // 0 = input-token ceiling disabled
|
|
24
|
+
max_output_tokens: number; // 0 = output-token ceiling disabled
|
|
25
|
+
max_calls: number; // 0 = per-invocation call cap disabled (fan-out unbounded)
|
|
26
26
|
max_total_usd: number; // 0 = USD ceiling disabled (token caps still apply)
|
|
27
27
|
daily_limit_usd: number; // 0 = rolling 24h cap disabled (D3)
|
|
28
28
|
|
|
@@ -35,8 +35,11 @@ export class CostBudget {
|
|
|
35
35
|
daily_limit_usd?: number;
|
|
36
36
|
} = {},
|
|
37
37
|
) {
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
// ADR-279: the two token ceilings default to 0 = unbounded, as the two
|
|
39
|
+
// USD ceilings below already did. `max_calls` keeps its default — it
|
|
40
|
+
// bounds fan-out against a plan quota, not money.
|
|
41
|
+
this.max_input_tokens = args.max_input_tokens ?? 0;
|
|
42
|
+
this.max_output_tokens = args.max_output_tokens ?? 0;
|
|
40
43
|
this.max_calls = args.max_calls ?? 10;
|
|
41
44
|
this.max_total_usd = args.max_total_usd ?? 0.0;
|
|
42
45
|
this.daily_limit_usd = args.daily_limit_usd ?? 0.0;
|
|
@@ -101,9 +104,17 @@ export function _breach(
|
|
|
101
104
|
budget: CostBudget,
|
|
102
105
|
): BreachKind {
|
|
103
106
|
const usd = est ? _total_usd(est) : 0.0;
|
|
107
|
+
// Zero disables a token cap, as `ai-council-config.md:84-86` has always
|
|
108
|
+
// said it does. Until 2026-10-06 these two comparisons carried no guard
|
|
109
|
+
// while the two USD comparisons below them did, so a budget with every
|
|
110
|
+
// cap at zero — the contract's "no bound at all" — breached on a
|
|
111
|
+
// ten-token estimate. The guard goes on each cap separately: a user who
|
|
112
|
+
// set one and left the other at zero is bounded by the one they set.
|
|
104
113
|
if (
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
(budget.max_input_tokens > 0 &&
|
|
115
|
+
spent.input + (est ? est.input_tokens : 0) > budget.max_input_tokens) ||
|
|
116
|
+
(budget.max_output_tokens > 0 &&
|
|
117
|
+
spent.output + (est ? est.output_tokens : 0) > budget.max_output_tokens)
|
|
107
118
|
) {
|
|
108
119
|
return 'tokens';
|
|
109
120
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendor-CLI sentinel values that are DATA, carried in a module with no
|
|
3
|
+
* dependencies of its own.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS FILE EXISTS, measured rather than argued. `OPENAI_CLI_VENDOR_DEFAULT`
|
|
6
|
+
* is a single string, and it used to live in `clients.ts` beside the transport
|
|
7
|
+
* classes that compare against it. `ai_council/config.ts` imports that one
|
|
8
|
+
* string and nothing else from `clients.ts`; `config.ts` is reachable from
|
|
9
|
+
* `council-availability`, which is bound on `session_start`. So every hook
|
|
10
|
+
* dispatch on every slot carried the whole council transport layer —
|
|
11
|
+
* `clients.ts` and its closure, **51,523 bytes** of the composed
|
|
12
|
+
* `dist/hooks/dispatch.js` — to compare one string against another. Breaking
|
|
13
|
+
* that one import edge removes exactly that, with no capability removed
|
|
14
|
+
* anywhere: every entry point that actually talks to a vendor CLI imports
|
|
15
|
+
* `clients.ts` directly and still does.
|
|
16
|
+
*
|
|
17
|
+
* The bytes are not an abstraction. `src/config/hook-bundle-budget.json` caps
|
|
18
|
+
* the composed bundle, the cap is a shrink-only ratchet, and on 2026-10-02 the
|
|
19
|
+
* tree stood 75 bytes under it — a state in which no concern anywhere could add
|
|
20
|
+
* a line. This module is how `road-to-a-rule-carrier-that-works-outside-the-repo`
|
|
21
|
+
* Phase 1 paid for its own runtime code instead of asking for a raise.
|
|
22
|
+
*
|
|
23
|
+
* WHAT BELONGS HERE: a vendor-facing constant that a CONFIGURATION reader needs
|
|
24
|
+
* and a TRANSPORT reader also happens to use. Nothing that imports anything.
|
|
25
|
+
* The moment this file gains an import it stops being the cheap half of the
|
|
26
|
+
* split and the split stops being worth its own file.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Sentinel: let the codex CLI pick its own model, by omitting `--model`.
|
|
31
|
+
*
|
|
32
|
+
* This is not a placeholder for a value nobody looked up. Measured
|
|
33
|
+
* 2026-08-15 against `codex exec --json` on a ChatGPT-account (subscription)
|
|
34
|
+
* transport, every explicitly named candidate was refused with
|
|
35
|
+
* `400 invalid_request_error: The '<model>' model is not supported when using
|
|
36
|
+
* Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
|
|
37
|
+
* value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
|
|
38
|
+
*
|
|
39
|
+
* So the only value known to work on this transport is "whatever the CLI
|
|
40
|
+
* chooses", and pinning ANY name here would re-break the seat the next time
|
|
41
|
+
* the vendor rotates its lineup. The label is carried into records as-is so a
|
|
42
|
+
* reader can see that no model was pinned, rather than a name being implied
|
|
43
|
+
* that nobody verified.
|
|
44
|
+
*/
|
|
45
|
+
export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';
|