@event4u/agent-config 16.5.0 → 17.1.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 +2 -2
- package/.claude-plugin/skills/install-agent-config/SKILL.md +4 -4
- package/CHANGELOG.md +114 -530
- package/CONTRIBUTING.md +47 -0
- package/README.md +25 -24
- package/dist/agent-src/commands/{design.md → agent-design.md} +10 -6
- package/dist/agent-src/commands/agents/init.md +66 -3
- package/dist/agent-src/commands/agents/user/init.md +3 -0
- package/dist/agent-src/commands/{optimize/deep.md → analyze/and-optimize.md} +72 -33
- package/dist/agent-src/commands/analyze/inbox.md +168 -37
- package/dist/agent-src/commands/analyze/pr.md +144 -0
- package/dist/agent-src/commands/analyze/{repo.md → reference.md} +85 -14
- package/dist/agent-src/commands/analyze/roadmap-repos.md +19 -10
- package/dist/agent-src/commands/analyze.md +28 -12
- package/dist/agent-src/commands/audit.md +115 -0
- package/dist/agent-src/commands/brand/review.md +13 -2
- package/dist/agent-src/commands/brand/tokens.md +3 -3
- package/dist/agent-src/commands/brand/voice.md +8 -5
- package/dist/agent-src/commands/brand.md +2 -2
- package/dist/agent-src/commands/challenge-me/closure.md +25 -0
- package/dist/agent-src/commands/design-system/import.md +8 -3
- package/dist/agent-src/commands/design-system/sync.md +98 -0
- package/dist/agent-src/commands/design-system.md +6 -1
- package/dist/agent-src/commands/evals/analyze.json +44 -0
- package/dist/agent-src/commands/evals/audit.json +12 -0
- package/dist/agent-src/commands/evals/retro.json +12 -0
- package/dist/agent-src/commands/fix/ci.md +10 -8
- package/dist/agent-src/commands/ghostwriter/write.md +22 -0
- package/dist/agent-src/commands/memory/learn-low-impact.md +70 -83
- package/dist/agent-src/commands/memory/propose.md +12 -0
- package/dist/agent-src/commands/memory.md +1 -1
- package/dist/agent-src/commands/optimize.md +4 -3
- package/dist/agent-src/commands/post-as/me.md +18 -0
- package/dist/agent-src/commands/pr/create.md +17 -342
- package/dist/agent-src/commands/pr/merge.md +129 -368
- package/dist/agent-src/commands/retro.md +121 -0
- package/dist/agent-src/commands/review/routing.md +1 -1
- package/dist/agent-src/commands/roadmap/next.md +4 -1
- package/dist/agent-src/commands/roadmap/process-full.md +46 -333
- package/dist/agent-src/commands/roadmap/triage-parked.md +6 -2
- package/dist/agent-src/commands/team-knowledge/consolidate.md +2 -2
- package/dist/agent-src/commands/team-knowledge.md +1 -1
- package/dist/agent-src/commands/threat-model.md +1 -1
- package/dist/agent-src/commands/upstream-contribute.md +91 -101
- package/dist/agent-src/commands/worktree/cleanup.md +18 -11
- package/dist/agent-src/contexts/contracts/consumer-agents-md-guide.md +54 -0
- package/dist/agent-src/contexts/execution/analysis-loop.md +137 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +3 -3
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +1 -1
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +10 -2
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +11 -4
- package/dist/agent-src/contexts/execution/pr-create-branches-content.md +250 -0
- package/dist/agent-src/contexts/execution/pr-create-branches-freshness.md +150 -0
- package/dist/agent-src/contexts/execution/pr-merge-queue.md +287 -0
- package/dist/agent-src/contexts/execution/pr-merge-sync.md +276 -0
- package/dist/agent-src/contexts/execution/pr-merge-trust-boundary.md +69 -0
- package/dist/agent-src/contexts/execution/process-full-all.md +233 -0
- package/dist/agent-src/contexts/execution/process-full-delivery.md +231 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract-branches.md +42 -0
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +1 -35
- package/dist/agent-src/contexts/execution/roadmap-process-loop-close.md +235 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-prescan.md +216 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-run.md +253 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop-set.md +212 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +25 -864
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +14 -2
- package/dist/agent-src/contexts/execution/subagent-steering.md +65 -8
- package/dist/agent-src/contexts/model-recommendations.md +5 -5
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/dist/agent-src/guidelines/agent-infra/model-recommendation.md +11 -5
- package/dist/agent-src/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/dist/agent-src/guidelines/design-antipatterns.md +5 -0
- package/dist/agent-src/guidelines/design-asset-discipline.md +17 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +1 -0
- package/dist/agent-src/guidelines/php/api-design.md +10 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +7 -6
- package/dist/agent-src/rules/code-provenance.md +1 -1
- package/dist/agent-src/rules/context-hygiene.md +0 -1
- package/dist/agent-src/rules/design-fidelity.md +12 -13
- package/dist/agent-src/rules/external-reference-deep-dive.md +2 -2
- package/dist/agent-src/rules/fix-what-you-see.md +1 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +14 -15
- package/dist/agent-src/rules/missing-skill-recovery.md +12 -11
- package/dist/agent-src/rules/neighbour-precedence.md +1 -1
- package/dist/agent-src/rules/recurring-criticism.md +1 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -2
- package/dist/agent-src/rules/self-repair-loop.md +2 -2
- package/dist/agent-src/rules/token-budget-discipline.md +1 -1
- package/dist/agent-src/scripts/dashboard_mode.ts +4 -1
- package/dist/agent-src/scripts/roadmap_age.ts +175 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +3 -3
- package/dist/agent-src/skills/agent-security-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +12 -4
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +7 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +11 -1
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +7 -0
- package/dist/agent-src/skills/ai-council/references/execution-modes.md +7 -0
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +19 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +7 -0
- package/dist/agent-src/skills/api-design/SKILL.md +2 -2
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/authz-review/SKILL.md +5 -3
- package/dist/agent-src/skills/blade-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/brand/SKILL.md +7 -3
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +13 -6
- package/dist/agent-src/skills/brand-audit/SKILL.md +2 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-strategy/SKILL.md +5 -4
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +18 -39
- package/dist/agent-src/skills/brand-to-tokens/templates/marp-brand-deck.md.example +2 -2
- package/dist/agent-src/skills/brand-to-tokens/templates/reveal-brand-deck.yaml +2 -2
- package/dist/agent-src/skills/canvas-design/SKILL.md +12 -2
- package/dist/agent-src/skills/competitive-positioning/SKILL.md +2 -2
- package/dist/agent-src/skills/composer-packages/SKILL.md +18 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/content-funnel-design/SKILL.md +8 -1
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/context-document/SKILL.md +2 -2
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +6 -6
- package/dist/agent-src/skills/corpus-grounding/scripts/decision_engine.ts +13 -11
- package/dist/agent-src/skills/corpus-grounding/scripts/ground.mjs +1706 -0
- package/dist/agent-src/skills/corpus-grounding/scripts/schema_validator.ts +7 -1
- package/dist/agent-src/skills/dashboard-design/SKILL.md +1 -1
- package/dist/agent-src/skills/data-flow-mapper/SKILL.md +5 -2
- package/dist/agent-src/skills/database/SKILL.md +5 -4
- package/dist/agent-src/skills/decision-record/references/weighted-matrix.md +12 -0
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +1 -1
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +61 -11
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +1 -1
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +1 -1
- package/dist/agent-src/skills/design-intelligence/references/context-and-registers.md +10 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-intelligence/references/design-rules-checklist.md +4 -3
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +14 -14
- package/dist/agent-src/skills/{wireframe → design-review}/references/story-beat-ledger.schema.json +1 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +11 -3
- package/dist/agent-src/skills/design-system-capture/SKILL.md +15 -10
- package/dist/agent-src/skills/design-system-capture/references/design-system-json.md +20 -5
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +2 -2
- package/dist/agent-src/skills/design-tokens/SKILL.md +23 -23
- package/dist/agent-src/skills/design-tokens/scripts/tokens.mjs +1037 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +336 -13
- package/dist/agent-src/skills/design-tokens/templates/design-tokens-starter.json +52 -53
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +14 -276
- package/dist/agent-src/skills/existing-ui-audit/procedure.yaml +44 -0
- package/dist/agent-src/skills/existing-ui-audit/references/anti-slop-cross-reference.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/references/steps/00-inspect-stack-and-input.md +4 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01-enumerate-components.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/01b-detect-component-taxonomy.md +7 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/02-identify-design-system.md +12 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/03-detect-design-tokens.md +35 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04-detect-shadcn-inventory.md +13 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/04b-live-storybook-read.md +26 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/05-list-reusable-patterns.md +14 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/06-match-candidates.md +52 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/07-greenfield-branch.md +29 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/08-a11y-baseline.md +40 -0
- package/dist/agent-src/skills/existing-ui-audit/references/steps/09-validate-and-write.md +5 -0
- package/dist/agent-src/skills/experiment-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +16 -2
- package/dist/agent-src/skills/fe-design/references/design-read-and-memory.md +1 -1
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +6 -6
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/form-handler/SKILL.md +15 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +7 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +12 -0
- package/dist/agent-src/skills/git-workflow/references/push-closes-its-loop.md +10 -0
- package/dist/agent-src/skills/gtm-launch/SKILL.md +8 -1
- package/dist/agent-src/skills/html-deck/SKILL.md +7 -2
- package/dist/agent-src/skills/humanizer/SKILL.md +16 -3
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +13 -1
- package/dist/agent-src/skills/humanizer/references/fixtures.md +8 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +5 -4
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.mjs +197 -0
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +18 -22
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +5 -5
- package/dist/agent-src/skills/livewire/SKILL.md +1 -1
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +18 -0
- package/dist/agent-src/skills/logo-generation/SKILL.md +9 -3
- package/dist/agent-src/skills/market-entry-analysis/SKILL.md +6 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +2 -2
- package/dist/agent-src/skills/messaging-architecture/SKILL.md +8 -1
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +2 -2
- package/dist/agent-src/skills/playwright-testing/SKILL.md +2 -0
- package/dist/agent-src/skills/positioning-strategy/SKILL.md +10 -2
- package/dist/agent-src/skills/prediction-pool-optimizer/references/ev-fixtures.md +13 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/references/odds-and-bonus.md +7 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analyzer/SKILL.md +14 -75
- package/dist/agent-src/skills/project-analyzer/procedure.yaml +39 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/01-project-overview.md +9 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/02-architecture.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/03-data-layer.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/04-business-domains.md +7 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/05-api-surface.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/06-service-map.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/07-module-inventory.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/08-infrastructure-and-testing.md +5 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/09-agent-docs-audit.md +6 -0
- package/dist/agent-src/skills/project-analyzer/references/steps/10-gap-analysis.md +6 -0
- package/dist/agent-src/skills/quality-tools/references/js-ts-tools.md +10 -0
- package/dist/agent-src/skills/quality-tools/references/php-tools.md +13 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +11 -0
- package/dist/agent-src/skills/react-native-setup/SKILL.md +7 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +5 -1
- package/dist/agent-src/skills/react-shadcn-ui/references/registry.md +13 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.mjs +315 -0
- package/dist/agent-src/skills/react-shadcn-ui/scripts/shadcn_add.ts +6 -6
- 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 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +2 -2
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/archival.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/authoring.md +9 -2
- package/dist/agent-src/skills/roadmap-management/references/dashboard.md +3 -3
- package/dist/agent-src/skills/roadmap-management/references/lifecycle.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -4
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/dist/agent-src/skills/rule-writing/SKILL.md +1 -2
- package/dist/agent-src/skills/security/SKILL.md +41 -5
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +5 -3
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/SKILL.md +23 -8
- package/dist/agent-src/skills/skill-writing/references/section-patterns.md +19 -1
- package/dist/agent-src/skills/source-discovery/SKILL.md +3 -3
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/standards-from-config/SKILL.md +2 -2
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +5 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.mjs +99 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +13 -13
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +4 -3
- package/dist/agent-src/skills/svg-authoring/SKILL.md +7 -1
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +8 -3
- package/dist/agent-src/skills/tailwind-engineer/scripts/tailwind_config_gen.mjs +482 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +8 -1
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +5 -2
- package/dist/agent-src/skills/threat-modeling/data/reasoning.csv +10 -10
- package/dist/agent-src/skills/threat-modeling/data/surfaces.csv +11 -10
- package/dist/agent-src/skills/threat-modeling/data/threats.csv +34 -20
- package/dist/agent-src/skills/type-design/SKILL.md +196 -0
- package/dist/agent-src/skills/type-design/references/font-spec.md +90 -0
- package/dist/agent-src/skills/type-design/references/gates.md +113 -0
- package/dist/agent-src/skills/type-design/references/toolchain.md +66 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +21 -11
- package/dist/agent-src/skills/typography-system/references/worked-scales.md +85 -0
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +1 -1
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +120 -125
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +1 -1
- package/dist/agent-src/skills/voice-and-tone-design/SKILL.md +71 -2
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +16 -14
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/agents/proposal.example.md +1 -1
- package/dist/agent-src/templates/github-workflows/advisories-daily.yml +85 -0
- package/dist/agent-src/templates/roadmaps.md +44 -2
- package/dist/agent-src/templates/scripts/check_memory.ts +2 -2
- package/dist/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/dist/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/dist/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/dist/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/dist/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/dist/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/dist/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/dist/cli/commands/uiRender.js +72 -17
- package/dist/cli/commands/uiRenderAsset.js +10 -2
- package/dist/cli/commands/uiRenderAssetFonts.js +158 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +8 -20
- package/dist/cli/initRouting.js +1 -1
- package/dist/cli/mcp/dispatch.js +31 -9
- package/dist/cli/python/knowledge_ingest.js +7 -39
- package/dist/cli/python/workspace_secrets.js +4 -177
- package/dist/cli/registry.js +4 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +3 -2
- package/dist/cli-delegate/check_update_banner.js +635 -266
- package/dist/cli-delegate/{chunk-TMWYUOK4.js → chunk-2CX7NWRB.js} +224 -437
- package/dist/cli-delegate/chunk-2Y5AMLMY.js +136 -0
- package/dist/cli-delegate/chunk-3PK3VZHB.js +235 -0
- package/dist/cli-delegate/{chunk-OKJUIAPS.js → chunk-4E2W63DA.js} +1 -62
- package/dist/cli-delegate/chunk-5VO3RTMV.js +208 -0
- package/dist/cli-delegate/chunk-6E2LDY4F.js +27 -0
- package/dist/cli-delegate/{chunk-XQTPXKFA.js → chunk-6ZD2QZMN.js} +8 -17
- package/dist/cli-delegate/{chunk-6V5FMA3P.js → chunk-7CEI2YPS.js} +1 -1
- package/dist/cli-delegate/{chunk-DMSZHXZS.js → chunk-7DRWULEQ.js} +80 -7
- package/dist/cli-delegate/chunk-7NXCZSDL.js +54 -0
- package/dist/cli-delegate/chunk-AX3U3UWJ.js +328 -0
- package/dist/cli-delegate/{chunk-WOKWX5PL.js → chunk-BKALSTBZ.js} +18 -3
- package/dist/cli-delegate/chunk-BMGUGSY6.js +103 -0
- package/dist/cli-delegate/chunk-BYV46VRM.js +3309 -0
- package/dist/cli-delegate/{chunk-F3QDG2GT.js → chunk-BZJ4Y3CI.js} +259 -159
- package/dist/cli-delegate/{chunk-5GPULQBE.js → chunk-CMZEKSNN.js} +4280 -705
- package/dist/cli-delegate/chunk-DSY6LLCQ.js +127 -0
- package/dist/cli-delegate/{chunk-ZUZKZYCN.js → chunk-E3CFULNX.js} +67 -13
- package/dist/cli-delegate/{chunk-G5VVIZRC.js → chunk-F7HLSW6P.js} +1 -1
- package/dist/cli-delegate/chunk-FIEEOH5C.js +133 -0
- package/dist/cli-delegate/chunk-FKYZOWVD.js +719 -0
- package/dist/cli-delegate/chunk-I4KJYVPB.js +69 -0
- package/dist/cli-delegate/{chunk-JQOM7TTM.js → chunk-IDAOTDPE.js} +1 -100
- package/dist/cli-delegate/chunk-J2SJZICO.js +698 -0
- package/dist/cli-delegate/chunk-KR5ZIFPO.js +581 -0
- package/dist/cli-delegate/{chunk-WQWXGIWB.js → chunk-M6CRG5O6.js} +165 -15
- package/dist/cli-delegate/{chunk-PHD7OOLE.js → chunk-MQ2UDEGV.js} +14 -3
- package/dist/cli-delegate/chunk-NTM7G2V4.js +220 -0
- package/dist/cli-delegate/chunk-PV7S5DPJ.js +175 -0
- package/dist/cli-delegate/chunk-QBHEI5N4.js +919 -0
- package/dist/cli-delegate/{chunk-F7DQWYR5.js → chunk-RAXQOETZ.js} +6 -2
- package/dist/cli-delegate/{chunk-KR6EM23A.js → chunk-TULVDQ4L.js} +3 -48
- package/dist/cli-delegate/chunk-UUYEKXKR.js +20 -0
- package/dist/cli-delegate/{chunk-7XGD2OEU.js → chunk-UXWHY6CQ.js} +2 -1
- package/dist/cli-delegate/{chunk-PWX7CKMD.js → chunk-VC3ECUEK.js} +1 -1
- package/dist/cli-delegate/{chunk-T7XSJSUQ.js → chunk-VYZGJLCA.js} +1000 -814
- package/dist/cli-delegate/chunk-W5JXMF2T.js +77 -0
- package/dist/cli-delegate/{chunk-KXXWJTDO.js → chunk-WMNYVIYX.js} +1 -1
- package/dist/cli-delegate/chunk-XCY5KKUC.js +181 -0
- package/dist/cli-delegate/{chunk-6SRJTYJS.js → chunk-XIAPY44N.js} +37 -16
- package/dist/cli-delegate/{chunk-H76PHZBI.js → chunk-XLY5G3CM.js} +14 -19
- package/dist/cli-delegate/{chunk-6YQC2HLF.js → chunk-YHAPONWV.js} +54 -40
- package/dist/cli-delegate/cmd_adr_effective.js +41 -2
- package/dist/cli-delegate/cmd_analyze_session.js +7 -7
- package/dist/cli-delegate/cmd_brand_status.js +1287 -10
- package/dist/cli-delegate/cmd_ci_settle.js +330 -0
- package/dist/cli-delegate/cmd_conformance.js +487 -820
- package/dist/cli-delegate/cmd_doctor.js +26 -16
- package/dist/cli-delegate/cmd_doctor_neighbours.js +10 -7
- package/dist/cli-delegate/cmd_explain.js +9 -24
- package/dist/cli-delegate/cmd_export.js +15 -12
- package/dist/cli-delegate/cmd_fleet.js +6 -4
- package/dist/cli-delegate/cmd_git_convention.js +8 -4
- package/dist/cli-delegate/cmd_handoff.js +79 -242
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +4 -2
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +8 -6
- package/dist/cli-delegate/cmd_prune.js +17 -14
- package/dist/cli-delegate/cmd_route_audit.js +11 -8
- package/dist/cli-delegate/cmd_route_explain.js +649 -16
- package/dist/cli-delegate/cmd_session_recycle.js +15 -6
- package/dist/cli-delegate/cmd_settings_check.js +2 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +15 -12
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +17 -14
- package/dist/cli-delegate/cmd_uninstall.js +186 -32
- package/dist/cli-delegate/cmd_update.js +76 -16
- package/dist/cli-delegate/cmd_upgrade.js +38 -7
- package/dist/cli-delegate/cmd_validate.js +17 -14
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/dashboard_mode.js +1 -1
- package/dist/cli-delegate/gate_execute.js +4 -3
- package/dist/cli-delegate/roadmap_age.js +22 -0
- package/dist/cli-delegate/roadmap_gates.js +4 -3
- package/dist/cli-delegate/update_roadmap_progress.js +3 -2
- package/dist/cli-delegate/upgrade_unattended-VVL6JLSX.js +541 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +373 -190
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +5 -5
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +21 -16
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/chat_history.chunk.cjs +6852 -0
- package/dist/hooks/chat_history.chunk.cjs.sha256 +1 -0
- package/dist/hooks/dispatch.js +17450 -18612
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/egress_engine.chunk.cjs +915 -0
- package/dist/hooks/egress_engine.chunk.cjs.sha256 +1 -0
- package/dist/hooks/svg_rules.chunk.cjs +281 -49
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -1
- package/dist/install/claudeRuleRewrite.js +10 -3
- package/dist/install/conflict.js +59 -7
- package/dist/install/conflictTracker.js +93 -8
- package/dist/install/detect.js +3 -3
- package/dist/install/hostPermissionsAdapter.js +106 -0
- package/dist/install/install.mjs +3234 -1961
- package/dist/install/installThinLayer.js +2 -1
- package/dist/install/loggedWrites.js +142 -0
- package/dist/install/manifestFiles.js +21 -0
- package/dist/install/noGoDenyRows.js +300 -0
- package/dist/install/noGoRules.js +368 -0
- package/dist/install/ownershipLedger.js +133 -0
- package/dist/install/paths.js +12 -2
- package/dist/install/plan.js +1 -1
- package/dist/install/preflight.js +39 -8
- package/dist/install/preserve.js +96 -13
- package/dist/install/recordedOwnership.js +88 -5
- package/dist/install/rule_scope.js +20 -3
- package/dist/install/stagedRuntime.js +455 -0
- package/dist/install/toolsArg.js +19 -0
- package/dist/install/txlog.js +10 -6
- package/dist/install/userPin.js +47 -0
- package/dist/install/wizard-plan.js +26 -4
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +3 -2
- package/dist/mcp/registry-manifest.json +6 -5
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +10716 -5880
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +7 -12
- package/dist/scripts/_lib/asset_render_record.js +219 -0
- package/dist/scripts/_lib/claude_builtin_names.js +9 -4
- package/dist/scripts/_lib/claude_settings_hooks.js +102 -34
- package/dist/scripts/_lib/egress_rules.js +769 -0
- package/dist/scripts/_lib/environment_detector.js +24 -33
- package/dist/scripts/_lib/global_deploy_inventory.js +146 -9
- package/dist/scripts/_lib/guidelines_lane.js +10 -1
- package/dist/scripts/_lib/identifier_redaction.js +57 -0
- package/dist/scripts/_lib/installed_layer.js +17 -0
- package/dist/scripts/_lib/installed_layer_normalise.js +72 -0
- package/dist/scripts/_lib/lean_projection_mode.js +34 -152
- package/dist/scripts/_lib/project_tree_form.js +118 -0
- package/dist/scripts/_lib/scoped_projection.js +133 -3
- package/dist/scripts/_lib/settings_removed_keys.js +29 -0
- package/dist/scripts/_lib/settings_renamed_keys.js +17 -5
- package/dist/scripts/_lib/subagent_native_fields.js +35 -0
- package/dist/scripts/_lib/svg_filled_counter.js +285 -0
- package/dist/scripts/_lib/svg_rules.js +2 -0
- package/dist/scripts/_lib/ui_surface.js +19 -0
- package/dist/scripts/_lib/verification_command.js +364 -0
- package/dist/scripts/_lib/workspace_secrets.js +229 -0
- package/dist/scripts/ai_council/seat_policy.js +33 -0
- package/dist/scripts/ai_council/transport_resolver.js +9 -10
- package/dist/scripts/condense.js +25 -29
- package/dist/server/io/substituteTemplate.js +2 -2
- package/dist/server/io/yamlIO.js +2 -2
- package/dist/server/routes/install.js +5 -1
- package/dist/server/routes/settings.js +2 -2
- package/dist/server/routes/wizard.js +1 -1
- package/dist/server/schemas/settings.js +22 -16
- package/dist/server/serverInfo.js +1 -1
- package/dist/shared/brandTokenDocument.js +47 -0
- package/dist/shared/brandTokenPaths.js +43 -0
- package/dist/shared/settingsCarveOut.js +0 -7
- package/dist/shared/skillRanking.js +103 -5
- package/dist/shared/userMd/formAdapter.js +16 -0
- package/dist/shared/userMd/schema.js +17 -0
- package/dist/ui/assets/index-w70Ado09.js +23 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +89 -2
- package/docs/THIRD-PARTY-NOTICES.md +27 -0
- package/docs/contracts/settings-classes.md +27 -9
- package/docs/guidelines/agent-infra/api-cost-levers.md +4 -3
- package/docs/guidelines/agent-infra/model-recommendation.md +11 -5
- package/docs/guidelines/agent-infra/rule-body-migration-inventory.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +47 -24
- package/docs/guidelines/design-antipatterns.md +5 -0
- package/docs/guidelines/design-asset-discipline.md +17 -0
- package/docs/guidelines/design-fidelity-routing.md +1 -0
- package/docs/guidelines/php/api-design.md +10 -1
- package/llms.txt +12 -10
- package/package.json +13 -4
- package/src/agent-src/scripts/dashboard_mode.ts +4 -1
- package/src/agent-src/scripts/roadmap_age.ts +175 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +10 -2
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/check_memory.ts +2 -2
- package/src/agent-src/templates/scripts/historical-bug-patterns.example.yml +13 -1
- package/src/agent-src/templates/scripts/work_engine/cli.ts +17 -0
- package/src/agent-src/templates/scripts/work_engine/cli_args.ts +10 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +22 -13
- package/src/agent-src/templates/scripts/work_engine/dispatcher.ts +18 -4
- package/src/agent-src/templates/scripts/work_engine/procedure/checks.ts +283 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/run.ts +432 -0
- package/src/agent-src/templates/scripts/work_engine/procedure/sidecar.ts +185 -0
- package/src/agent-src/templates/scripts/work_engine/state.ts +3 -0
- package/src/config/agent-settings.template.yml +120 -57
- package/src/config/agents-paths.yml +13 -7
- package/src/config/ci-local-parity.yml +45 -1
- package/src/config/continuity-surface.json +51 -2
- package/src/config/depth-audit-samples.json +5 -0
- package/src/config/discovery/command-verbs.yml +1 -0
- package/src/config/dispatch-economy-metrics.json +1 -0
- package/src/config/egress-mutations/class-precedence-swapped.json +7 -0
- package/src/config/egress-mutations/credential-token-restores.json +7 -0
- package/src/config/egress-mutations/iban-checksum-disabled.json +7 -0
- package/src/config/egress-mutations/raw-value-in-the-count-record.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +176 -10
- package/src/config/gate-reachability-exemptions.json +3 -5
- package/src/config/gate-violation-baselines.json +32 -22
- package/src/config/gitignore-block.txt +6 -3
- package/src/config/hook-bundle-budget.json +34 -3
- package/src/config/hook-carrier-probes.json +30 -0
- package/src/config/hook-latency-budget.json +4 -2
- package/src/config/host-injection-effect.json +8 -1
- package/src/config/host-skill-frontmatter-keys.json +56 -0
- package/src/config/layer-form-brakes.json +4 -0
- package/src/config/layer-form-comparison-corpus.json +42 -0
- package/src/config/loop-surfaces.yaml +28 -47
- package/src/config/memory-twin-verdicts.yml +9 -1
- package/src/config/metric-registry.yml +40 -3
- package/src/config/pack-size-budget.json +15 -0
- package/src/config/procedure-core-budget.json +21 -0
- package/src/config/production-entries.json +18 -0
- package/src/config/profiles/minimal.ini +1 -1
- package/src/config/project-tree-form.json +24 -0
- package/src/config/reach-channels.yml +3 -3
- package/src/config/reach-prescriptions-intake.yml +1 -1
- package/src/config/release-gate-locality.yml +0 -7
- package/src/config/roadmap-step-size-baseline.json +118 -0
- package/src/config/routing-coverage-seed.json +93 -2
- package/src/config/skill-body-budget.json +686 -0
- package/src/config/skill-fork-pilot.json +17 -0
- package/src/config/skill-lifecycle-probes-codex.json +57 -0
- package/src/config/skill-lifecycle-probes.json +57 -0
- package/src/config/skill-output-shape.json +316 -0
- package/src/config/step-depth-table.json +58 -0
- package/src/config/turnaround-budget.json +90 -0
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/conflict.ts +61 -6
- package/src/install/conflictTracker.ts +143 -9
- package/src/install/detect.ts +3 -3
- package/src/install/hostPermissionsAdapter.ts +136 -0
- package/src/install/installThinLayer.ts +12 -1
- package/src/install/loggedWrites.ts +148 -0
- package/src/install/manifestFiles.ts +24 -0
- package/src/install/noGoDenyRows.ts +368 -0
- package/src/install/noGoRules.ts +438 -0
- package/src/install/ownershipLedger.ts +180 -0
- package/src/install/paths.ts +11 -2
- package/src/install/plan.ts +1 -1
- package/src/install/preflight.ts +42 -10
- package/src/install/preserve.ts +131 -13
- package/src/install/recordedOwnership.ts +121 -3
- package/src/install/rule_scope.ts +20 -3
- package/src/install/stagedRuntime.ts +528 -0
- package/src/install/toolsArg.ts +16 -0
- package/src/install/txlog.ts +10 -6
- package/src/install/types.ts +23 -2
- package/src/install/userPin.ts +54 -0
- package/src/install/wizard-plan.ts +25 -4
- package/src/scripts/_cli/_doctor_emit.ts +24 -0
- package/src/scripts/_cli/cmd_brand_status.ts +223 -12
- package/src/scripts/_cli/cmd_ci_settle.ts +32 -0
- package/src/scripts/_cli/cmd_conformance.ts +3 -2
- package/src/scripts/_cli/cmd_doctor.ts +23 -44
- package/src/scripts/_cli/cmd_route_explain.ts +176 -2
- package/src/scripts/_cli/cmd_uninstall.ts +270 -26
- package/src/scripts/_cli/cmd_update.ts +49 -18
- package/src/scripts/_cli/cmd_upgrade.ts +38 -2
- package/src/scripts/_cli/detection_report.ts +7 -0
- package/src/scripts/_cli/doctor_execution.ts +1 -2
- package/src/scripts/_cli/doctor_install_mode.ts +39 -0
- package/src/scripts/_cli/doctor_network_posture.ts +3 -3
- package/src/scripts/_cli/doctor_ownership_ledger.ts +126 -0
- package/src/scripts/_cli/doctor_update_verdict.ts +104 -0
- package/src/scripts/_cli/explain_last/scrubber.ts +9 -21
- package/src/scripts/_cli/upgrade_unattended.ts +548 -0
- package/src/scripts/_dispatch.bash +42 -9
- package/src/scripts/_lib/activation_ladder.ts +1 -1
- package/src/scripts/_lib/advisory_inventory.ts +405 -0
- package/src/scripts/_lib/advisory_notice.ts +270 -0
- package/src/scripts/_lib/advisory_sources.ts +752 -0
- package/src/scripts/_lib/advisory_verdicts.ts +363 -0
- package/src/scripts/_lib/agent_artifact_location.ts +177 -0
- package/src/scripts/_lib/agent_settings.ts +7 -12
- package/src/scripts/_lib/arrival_record.ts +217 -0
- package/src/scripts/_lib/asset_render_record.ts +247 -0
- package/src/scripts/_lib/billing_grant.ts +4 -2
- package/src/scripts/_lib/brand_voice_slot.ts +258 -0
- package/src/scripts/_lib/canary_status.ts +24 -0
- package/src/scripts/_lib/cc_transcript.ts +276 -0
- package/src/scripts/_lib/changelog_eras.ts +83 -0
- package/src/scripts/_lib/claim_phrases.ts +71 -0
- package/src/scripts/_lib/classify_update.ts +171 -0
- package/src/scripts/_lib/claude_builtin_names.ts +9 -4
- package/src/scripts/_lib/claude_hook_scope.ts +195 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +118 -34
- package/src/scripts/_lib/codex_resident_set.ts +460 -0
- package/src/scripts/_lib/codex_skill_finder.ts +225 -0
- package/src/scripts/_lib/confusables.ts +19 -0
- package/src/scripts/_lib/consumer_impact.ts +199 -0
- package/src/scripts/_lib/content_class.ts +127 -0
- package/src/scripts/_lib/council_settings_block.ts +9 -2
- package/src/scripts/_lib/counted_probe.ts +68 -1
- package/src/scripts/_lib/credential_deny_rows.ts +151 -0
- package/src/scripts/_lib/credential_files.ts +367 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +2 -2
- package/src/scripts/_lib/depth_flip.ts +141 -0
- package/src/scripts/_lib/design_lock.ts +117 -0
- package/src/scripts/_lib/design_sync_ledger.ts +142 -0
- package/src/scripts/_lib/design_sync_plan.ts +177 -0
- package/src/scripts/_lib/design_sync_reconcile.ts +159 -0
- package/src/scripts/_lib/design_sync_verify.ts +99 -0
- package/src/scripts/_lib/design_system_claude_design.ts +323 -0
- package/src/scripts/_lib/design_system_import.ts +84 -6
- package/src/scripts/_lib/dispatch_import_closure.ts +42 -11
- package/src/scripts/_lib/egress_credential_env.ts +35 -0
- package/src/scripts/_lib/egress_engine.ts +22 -0
- package/src/scripts/_lib/egress_known_values.ts +223 -0
- package/src/scripts/_lib/egress_normalize.ts +67 -0
- package/src/scripts/_lib/egress_prefixes.ts +42 -0
- package/src/scripts/_lib/egress_rules.ts +899 -0
- package/src/scripts/_lib/egress_rules_linearity.ts +56 -0
- package/src/scripts/_lib/egress_sender_scan.ts +290 -0
- package/src/scripts/_lib/egress_session_table.ts +510 -0
- package/src/scripts/_lib/egress_text.ts +63 -0
- package/src/scripts/_lib/egress_token.ts +252 -0
- package/src/scripts/_lib/empty_cycles.ts +1 -1
- package/src/scripts/_lib/environment_detector.ts +45 -30
- package/src/scripts/_lib/exemption_shape.ts +75 -1
- package/src/scripts/_lib/floor_posture.ts +185 -0
- package/src/scripts/_lib/forge_protection.ts +140 -2
- package/src/scripts/_lib/global_deploy_inventory.ts +159 -6
- package/src/scripts/_lib/guidelines_lane.ts +12 -1
- package/src/scripts/_lib/hand_kinds.ts +65 -0
- package/src/scripts/_lib/headless_invocation.ts +3 -3
- package/src/scripts/_lib/host_capability.ts +44 -7
- package/src/scripts/_lib/host_env_write.ts +39 -18
- package/src/scripts/_lib/host_listing_model.ts +14 -7
- package/src/scripts/_lib/identifier_redaction.ts +62 -0
- package/src/scripts/_lib/impact_bump.ts +70 -0
- package/src/scripts/_lib/install_reach_checks.ts +53 -1
- package/src/scripts/_lib/installed_layer.ts +31 -0
- package/src/scripts/_lib/installed_layer_normalise.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_classify.ts +75 -0
- package/src/scripts/_lib/instructions_loaded_event.ts +53 -0
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/layer_form_corpus.ts +165 -0
- package/src/scripts/_lib/layer_form_decision.ts +248 -0
- package/src/scripts/_lib/layer_form_evidence.ts +112 -0
- package/src/scripts/_lib/lean_projection_mode.ts +32 -161
- package/src/scripts/_lib/llm_proposer_transport.ts +1 -0
- package/src/scripts/_lib/loop_guards.ts +8 -120
- package/src/scripts/_lib/major_surface.ts +207 -0
- package/src/scripts/_lib/mcp_bridge.ts +30 -69
- package/src/scripts/_lib/merge_clearance_record.ts +384 -0
- package/src/scripts/_lib/neighbour_census.ts +18 -1
- package/src/scripts/_lib/orchestration_record.ts +61 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +15 -23
- package/src/scripts/_lib/pin_advice.ts +49 -0
- package/src/scripts/_lib/platform_anchor.ts +222 -0
- package/src/scripts/_lib/price_freshness.ts +112 -0
- package/src/scripts/_lib/procedure_checks.ts +5 -0
- package/src/scripts/_lib/production_reach.ts +194 -0
- package/src/scripts/_lib/project_tree_form.ts +134 -0
- package/src/scripts/_lib/projection_key_migration.ts +122 -0
- package/src/scripts/_lib/prompt_shape.ts +13 -2
- package/src/scripts/_lib/provenance_verify.ts +272 -0
- package/src/scripts/_lib/quota_parked.ts +29 -14
- package/src/scripts/_lib/ratification_artifact.ts +64 -1
- package/src/scripts/_lib/ratification_subject.ts +508 -46
- package/src/scripts/_lib/release_findings_ingest.ts +36 -311
- package/src/scripts/_lib/release_highlights.ts +72 -2
- package/src/scripts/_lib/release_settings_surface.ts +392 -0
- package/src/scripts/_lib/review_round.ts +134 -0
- package/src/scripts/_lib/roadmap_checkboxes.ts +1 -1
- package/src/scripts/_lib/roadmap_slug_lock.ts +254 -0
- package/src/scripts/_lib/roadmap_step_size.ts +75 -0
- package/src/scripts/_lib/run_checkpoint.ts +60 -3
- package/src/scripts/_lib/runtime_wiring_checks.ts +15 -1
- package/src/scripts/_lib/scope_guard.sh +64 -5
- package/src/scripts/_lib/scoped_projection.ts +136 -3
- package/src/scripts/_lib/secret_detector.ts +24 -103
- package/src/scripts/_lib/security_fix.ts +429 -0
- package/src/scripts/_lib/security_fix_context.ts +133 -0
- package/src/scripts/_lib/self_repair.ts +69 -39
- package/src/scripts/_lib/self_repair_outgoing.ts +209 -0
- package/src/scripts/_lib/self_repair_payload.ts +86 -0
- package/src/scripts/_lib/session_eol.ts +3 -0
- package/src/scripts/_lib/session_pr_watch.ts +207 -0
- package/src/scripts/_lib/session_register.ts +51 -1
- package/src/scripts/_lib/session_tag.ts +51 -0
- package/src/scripts/_lib/settings_removed_keys.ts +30 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +19 -5
- package/src/scripts/_lib/skill_catalogue.ts +66 -25
- package/src/scripts/_lib/skill_fork_pilot.ts +121 -0
- package/src/scripts/_lib/skill_leases.ts +203 -0
- package/src/scripts/_lib/skill_listing_overrides.ts +294 -0
- package/src/scripts/_lib/skill_materialisation.ts +388 -0
- package/src/scripts/_lib/skill_materialisation_gate.ts +210 -0
- package/src/scripts/_lib/skill_materialisation_lock.ts +149 -0
- package/src/scripts/_lib/skill_materialisation_triggers.ts +96 -0
- package/src/scripts/_lib/skill_origin.ts +21 -1
- package/src/scripts/_lib/skill_reach.ts +342 -0
- package/src/scripts/_lib/source_shape.ts +7 -2
- package/src/scripts/_lib/sqlite_guard.ts +1 -1
- package/src/scripts/_lib/step_anatomy.ts +330 -0
- package/src/scripts/_lib/subagent_capsule.ts +8 -2
- package/src/scripts/_lib/subagent_native_fields.ts +30 -0
- package/src/scripts/_lib/subagent_spawn.ts +36 -0
- package/src/scripts/_lib/subagent_steering.ts +367 -0
- package/src/scripts/_lib/svg_filled_counter.ts +287 -0
- package/src/scripts/_lib/svg_rules.ts +2 -0
- package/src/scripts/_lib/test_delta.ts +89 -6
- package/src/scripts/_lib/tier_downshift_verdict.ts +268 -0
- package/src/scripts/_lib/tool_result_census.ts +62 -0
- package/src/scripts/_lib/trigger_routers.ts +1 -0
- package/src/scripts/_lib/turnaround_throughput.ts +378 -0
- package/src/scripts/_lib/ui_surface.ts +22 -0
- package/src/scripts/_lib/unattended_gates.ts +100 -0
- package/src/scripts/_lib/undeployed_fixes.ts +34 -0
- package/src/scripts/_lib/update_check.ts +143 -12
- package/src/scripts/_lib/update_invite.ts +116 -0
- package/src/scripts/_lib/update_notice.ts +259 -0
- package/src/scripts/_lib/verify_clause.ts +4 -2
- package/src/scripts/_lib/version_order.ts +146 -0
- package/src/scripts/_lib/worker_reuse.ts +191 -0
- package/src/scripts/_lib/workspace_secrets.ts +273 -0
- package/src/scripts/_lib/worktree_git.ts +67 -0
- package/src/scripts/_lib/worktree_ignored.ts +116 -0
- package/src/scripts/adoption_status.ts +330 -3
- package/src/scripts/adr_cite_check.ts +93 -0
- package/src/scripts/advisories.ts +803 -0
- package/src/scripts/ai-image/adapters/flux.sh +1 -0
- package/src/scripts/ai-image/adapters/gemini-image.sh +1 -0
- package/src/scripts/ai-image/adapters/ideogram.sh +1 -0
- package/src/scripts/ai-image/adapters/recraft.sh +1 -0
- package/src/scripts/ai-video/adapters/comfyui.sh +1 -0
- package/src/scripts/ai-video/adapters/fal.sh +1 -0
- package/src/scripts/ai-video/adapters/gemini-veo.sh +1 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +1 -0
- package/src/scripts/ai-video/adapters/kling.sh +1 -0
- package/src/scripts/ai-video/adapters/musetalk.sh +1 -0
- package/src/scripts/ai-video/adapters/openai-images.sh +1 -0
- package/src/scripts/ai-video/adapters/replicate.sh +1 -0
- package/src/scripts/ai-video/adapters/sora.sh +1 -0
- package/src/scripts/ai-video/adapters/syncso.sh +1 -0
- package/src/scripts/ai-video/stitch.sh +115 -2
- package/src/scripts/ai_council/airgap.ts +1 -0
- package/src/scripts/ai_council/api_transport.ts +27 -4
- package/src/scripts/ai_council/budget_guard.ts +300 -11
- package/src/scripts/ai_council/bundler.ts +20 -29
- package/src/scripts/ai_council/chairman.ts +20 -2
- package/src/scripts/ai_council/cli_agency_bounds.ts +158 -0
- package/src/scripts/ai_council/cli_launch_env.ts +54 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +18 -2
- package/src/scripts/ai_council/clients.ts +56 -73
- package/src/scripts/ai_council/config.ts +16 -22
- package/src/scripts/ai_council/council_egress.ts +167 -0
- package/src/scripts/ai_council/exposure_ledger.ts +117 -0
- package/src/scripts/ai_council/free_hand_shadow.ts +288 -0
- package/src/scripts/ai_council/free_route.ts +216 -0
- package/src/scripts/ai_council/free_route_catalog.ts +310 -0
- package/src/scripts/ai_council/free_route_client.ts +99 -0
- package/src/scripts/ai_council/free_rung.ts +61 -0
- package/src/scripts/ai_council/hand_payload.ts +338 -0
- package/src/scripts/ai_council/hand_schemas.ts +123 -0
- package/src/scripts/ai_council/jury_aggregate.ts +155 -1
- package/src/scripts/ai_council/kind_flip.ts +221 -0
- package/src/scripts/ai_council/kind_flip_state.ts +19 -0
- package/src/scripts/ai_council/learn_low_impact_preview.ts +50 -22
- package/src/scripts/ai_council/modification_review.ts +98 -5
- package/src/scripts/ai_council/necessity.ts +7 -0
- package/src/scripts/ai_council/orchestrator.ts +23 -26
- package/src/scripts/ai_council/pricing.ts +10 -0
- package/src/scripts/ai_council/redact_low_impact_entry.ts +5 -2
- package/src/scripts/ai_council/response_render.ts +27 -4
- package/src/scripts/ai_council/round_reservations.ts +119 -0
- package/src/scripts/ai_council/route_chooser.ts +161 -0
- package/src/scripts/ai_council/route_liveness.ts +152 -0
- package/src/scripts/ai_council/route_member.ts +114 -0
- package/src/scripts/ai_council/seat_policy.ts +47 -0
- package/src/scripts/ai_council/seat_resume.ts +40 -0
- package/src/scripts/ai_council/self_hosted_probe.ts +327 -0
- package/src/scripts/ai_council/shadow_dispatch.ts +13 -3
- package/src/scripts/ai_council/spend_gate.ts +18 -2
- package/src/scripts/ai_council/status_surface.ts +39 -0
- package/src/scripts/ai_council/transport_resolver.ts +15 -18
- package/src/scripts/analysis_analysts.ts +226 -0
- package/src/scripts/analysis_anchors.ts +140 -0
- package/src/scripts/analysis_and_optimize.ts +44 -0
- package/src/scripts/analysis_emit.ts +150 -0
- package/src/scripts/analysis_exchange.ts +186 -0
- package/src/scripts/analysis_gate.ts +158 -0
- package/src/scripts/analysis_inbox_final.ts +173 -0
- package/src/scripts/analysis_ledger.ts +119 -0
- package/src/scripts/analysis_pr_optimize.ts +219 -0
- package/src/scripts/analysis_pr_review.ts +240 -0
- package/src/scripts/analysis_pr_target.ts +121 -0
- package/src/scripts/analysis_prompts.ts +130 -0
- package/src/scripts/analysis_publish.ts +358 -0
- package/src/scripts/analysis_questions.ts +78 -0
- package/src/scripts/analysis_run.ts +248 -0
- package/src/scripts/analysis_run_record.ts +210 -0
- package/src/scripts/analysis_target.ts +343 -0
- package/src/scripts/analysis_validate.ts +161 -0
- package/src/scripts/anchor_eval_falsify.ts +1 -1
- package/src/scripts/arrival_report.ts +115 -0
- package/src/scripts/ask_transport.ts +406 -35
- package/src/scripts/backfill_model_tier.ts +4 -5
- package/src/scripts/before_complete_hook.ts +48 -2
- package/src/scripts/bench_hook_latency.ts +3 -3
- package/src/scripts/bench_procedure_cursor.ts +440 -0
- package/src/scripts/bootstrap.sh +3 -3
- package/src/scripts/build_exit_code_register.ts +440 -0
- package/src/scripts/build_proof.ts +23 -1
- package/src/scripts/cache_realization_report.ts +155 -14
- package/src/scripts/canary_liveness.ts +117 -0
- package/src/scripts/chat_history.ts +12 -15
- package/src/scripts/check_account_surface.ts +318 -0
- package/src/scripts/check_agent_artifact_location.ts +17 -160
- package/src/scripts/check_bundle_path_leakage.ts +6 -0
- package/src/scripts/check_ci_local_parity.ts +21 -13
- package/src/scripts/check_claims.ts +77 -2
- package/src/scripts/check_completion_review.ts +34 -1
- package/src/scripts/check_concern_admissions.ts +41 -5
- package/src/scripts/check_consumer_scope_flip.ts +1 -1
- package/src/scripts/check_context_paths.ts +2 -0
- package/src/scripts/check_council_layout.ts +9 -0
- package/src/scripts/check_credential_spelling.ts +267 -0
- package/src/scripts/check_egress_mutations.ts +239 -0
- package/src/scripts/check_enforcement_coverage.ts +16 -3
- package/src/scripts/check_estate_count.ts +16 -1
- package/src/scripts/check_finding_dispositions.ts +174 -73
- package/src/scripts/check_gate_coverage.ts +123 -21
- package/src/scripts/check_gate_reachability.ts +16 -2
- package/src/scripts/check_generator_sync.ts +46 -0
- package/src/scripts/check_hook_bundle_composition.ts +139 -1
- package/src/scripts/check_host_docs_digest.ts +142 -5
- package/src/scripts/check_kernel_edit_ratified.ts +301 -76
- package/src/scripts/check_kernel_rule_bundle.ts +14 -10
- package/src/scripts/check_knowledge_cards.ts +83 -3
- package/src/scripts/check_memory.ts +13 -3
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_permission_deny_syntax.ts +247 -0
- package/src/scripts/check_platform_anchor.ts +243 -0
- package/src/scripts/check_proposal.ts +183 -1
- package/src/scripts/check_reach_channels.ts +5 -3
- package/src/scripts/check_references.ts +5 -2
- package/src/scripts/check_release_manifest_content.ts +33 -0
- package/src/scripts/check_release_pr_shape.ts +8 -3
- package/src/scripts/check_rule_invariants.ts +9 -1
- package/src/scripts/check_skill_body_budget.ts +343 -0
- package/src/scripts/check_skill_requires.ts +137 -1
- package/src/scripts/check_step_production_reach.ts +257 -0
- package/src/scripts/check_step_receipts.ts +246 -0
- package/src/scripts/check_structural_breaking.ts +7 -1
- package/src/scripts/check_suppression_hygiene.ts +8 -0
- package/src/scripts/check_test_weakening.ts +14 -0
- package/src/scripts/check_token_quality_golden.ts +5 -1
- package/src/scripts/check_update_banner.ts +50 -3
- package/src/scripts/check_verify_expectation_delta.ts +2 -1
- package/src/scripts/check_voice_lexicon.ts +531 -0
- package/src/scripts/ci_os_attribution.ts +327 -0
- package/src/scripts/ci_platform_scope.ts +69 -0
- package/src/scripts/ci_settle.ts +4 -1
- package/src/scripts/ci_status.ts +0 -1
- package/src/scripts/ci_time_to_green.ts +748 -0
- package/src/scripts/classify_merge_risk.ts +407 -19
- package/src/scripts/code_graph/sqlite_store.ts +1 -1
- package/src/scripts/compile_trigger_evals.ts +353 -0
- package/src/scripts/condense.ts +25 -31
- package/src/scripts/consumer_matrix.ts +61 -3
- package/src/scripts/council_availability_hook.ts +12 -4
- package/src/scripts/council_cli.ts +56 -44
- package/src/scripts/cross_repo_retrieve.ts +9 -72
- package/src/scripts/design_lock.ts +106 -0
- package/src/scripts/design_slop_rules.ts +30 -0
- package/src/scripts/design_sync.ts +264 -0
- package/src/scripts/design_system_import.ts +30 -13
- package/src/scripts/dispatch_economy_report.ts +46 -1
- package/src/scripts/dispatch_r2_reviewer.ts +41 -5
- package/src/scripts/egress_canary.ts +166 -0
- package/src/scripts/egress_sender_census.ts +101 -0
- package/src/scripts/external_sources_denylist.json +94 -12
- package/src/scripts/generate_catalog.ts +6 -2
- package/src/scripts/generate_owned_digest.ts +163 -0
- package/src/scripts/generate_reference_toc.ts +143 -0
- package/src/scripts/generate_subagent_floor.ts +11 -1
- package/src/scripts/handoff_context_hook.ts +34 -0
- package/src/scripts/hook_carrier_census.ts +263 -0
- package/src/scripts/hook_chunks.d.mts +12 -0
- package/src/scripts/hook_chunks.mjs +114 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +68 -42
- package/src/scripts/hooks/block_config_weakening.ts +127 -3
- package/src/scripts/hooks/block_credential_reads.ts +165 -0
- package/src/scripts/hooks/block_no_verify.ts +47 -23
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +38 -7
- package/src/scripts/hooks/category_a.ts +202 -25
- package/src/scripts/hooks/concern_failure_policy.ts +6 -6
- package/src/scripts/hooks/concern_registry.ts +31 -6
- package/src/scripts/hooks/concern_registry_types.ts +11 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +105 -15
- package/src/scripts/hooks/design_pass_hook.ts +42 -10
- package/src/scripts/hooks/dispatch_hook.ts +14 -13
- package/src/scripts/hooks/egress_engine_loader.ts +125 -0
- package/src/scripts/hooks/egress_stage.ts +440 -0
- package/src/scripts/hooks/hook_stdin.ts +29 -4
- package/src/scripts/hooks/host_docs_pages.ts +194 -0
- package/src/scripts/hooks/host_docs_pages.yaml +75 -0
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.yaml +22 -21
- package/src/scripts/hooks/host_rate_marker_hook.ts +73 -0
- package/src/scripts/hooks/instructions_observer_hook.ts +170 -0
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -1
- package/src/scripts/hooks/lazy_concern.ts +148 -0
- package/src/scripts/hooks/orchestration_record_hook.ts +80 -2
- package/src/scripts/hooks/payload_stub.ts +43 -6
- package/src/scripts/hooks/permission_gate.ts +7 -7
- package/src/scripts/hooks/push_settle_hook.ts +32 -3
- package/src/scripts/hooks/replay_hook.ts +43 -0
- package/src/scripts/hooks/reread_guard_hook.ts +87 -10
- package/src/scripts/hooks/rtk_wrap_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +8 -1
- package/src/scripts/hooks/session_eol_hook.ts +48 -1
- package/src/scripts/hooks/source_first_gate_hook.ts +6 -8
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +162 -10
- package/src/scripts/hooks/state_io.ts +2 -2
- package/src/scripts/hooks/subagent_ledger_hook.ts +80 -0
- package/src/scripts/hooks/svg_obligation.ts +75 -19
- package/src/scripts/hooks/tool_result_bytes_hook.ts +14 -5
- package/src/scripts/hooks/turn_end_gate_hook.ts +1 -1
- package/src/scripts/hooks/ui_route_nudge_hook.ts +2 -12
- package/src/scripts/hooks_doctor.ts +31 -0
- package/src/scripts/hooks_status.ts +58 -3
- package/src/scripts/inbox_source_census.ts +74 -13
- package/src/scripts/install +25 -3
- package/src/scripts/install.ts +61 -92
- package/src/scripts/interruption_report.ts +11 -1
- package/src/scripts/layer_baseline_report.ts +267 -0
- package/src/scripts/learning_sidecar.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +3 -0
- package/src/scripts/lint_blocker_citations.ts +104 -0
- package/src/scripts/lint_breaking_changes_index.ts +40 -7
- package/src/scripts/lint_consolidation_lineage.ts +144 -16
- package/src/scripts/lint_consumer_internal_refs.ts +90 -42
- package/src/scripts/lint_context_spine_usage.ts +21 -0
- package/src/scripts/lint_decision_classes.ts +34 -0
- package/src/scripts/lint_design_antipattern_parity.ts +39 -7
- package/src/scripts/lint_evidence_artifacts.ts +31 -0
- package/src/scripts/lint_example_fences.ts +11 -2
- package/src/scripts/lint_ghostwriter_source.ts +42 -10
- package/src/scripts/lint_hook_manifest.ts +118 -0
- package/src/scripts/lint_marketplace_install_completeness.ts +4 -0
- package/src/scripts/lint_mcp_config_security.ts +9 -11
- package/src/scripts/lint_plan_risk_register.ts +28 -1
- package/src/scripts/lint_positioning.ts +4 -4
- package/src/scripts/lint_provenance.ts +1 -0
- package/src/scripts/lint_roadmap_blockers.ts +114 -4
- package/src/scripts/lint_roadmap_complexity.ts +98 -0
- package/src/scripts/lint_skill_link_reach.ts +251 -9
- package/src/scripts/lint_skill_procedures.ts +252 -0
- package/src/scripts/lint_skill_scripts_readonly.ts +12 -1
- package/src/scripts/lint_subagent_determinism.ts +14 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +300 -21
- package/src/scripts/mcp_registry_submit.sh +2 -2
- package/src/scripts/mcp_server/consumer_tool_catalog.json +4 -4
- package/src/scripts/mcp_server/suggest_skill.ts +89 -4
- package/src/scripts/mcp_server/tools.ts +2 -33
- package/src/scripts/measure_skill_ranker_baseline.ts +203 -5
- package/src/scripts/measure_turn_end_gate.ts +61 -1
- package/src/scripts/merge_clearance.ts +225 -0
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/network_sources.ts +236 -0
- package/src/scripts/no_go_deny_rows.ts +225 -0
- package/src/scripts/orchestration_record.ts +15 -2
- package/src/scripts/plan_test_shards.ts +103 -0
- package/src/scripts/pr_url_reminder_hook.ts +10 -0
- package/src/scripts/print_required_checks.ts +5 -5
- package/src/scripts/probe_depth_shadow.ts +406 -0
- package/src/scripts/probe_turnaround.ts +342 -10
- package/src/scripts/ratification_subject.ts +176 -0
- package/src/scripts/rdp_gate_classify.ts +1 -0
- package/src/scripts/rdp_quality_eval.ts +1 -0
- package/src/scripts/release.ts +31 -64
- package/src/scripts/release_drill.ts +63 -188
- package/src/scripts/release_env.ts +37 -0
- package/src/scripts/release_publication.ts +11 -10
- package/src/scripts/report_consumer_gate_reach.ts +233 -0
- package/src/scripts/report_merge_gate_load.ts +295 -0
- package/src/scripts/report_production_reach.ts +35 -0
- package/src/scripts/report_project_contract.ts +123 -0
- package/src/scripts/report_reducible_classes.ts +342 -0
- package/src/scripts/report_required_checks_drift.ts +5 -3
- package/src/scripts/report_skill_host_census.ts +199 -0
- package/src/scripts/report_standing_payload_by_host.ts +7 -7
- package/src/scripts/retro.ts +758 -0
- package/src/scripts/retro_facts.ts +575 -0
- package/src/scripts/retro_queue.ts +739 -0
- package/src/scripts/retro_session_facts.ts +218 -0
- package/src/scripts/retro_sweep.ts +493 -0
- package/src/scripts/retro_triage.ts +126 -0
- package/src/scripts/roadmap_context.ts +2 -2
- package/src/scripts/roadmap_drain_queue.ts +601 -0
- package/src/scripts/run_supervise.ts +24 -2
- package/src/scripts/schemas/agent-settings.schema.json +0 -16
- package/src/scripts/schemas/command.schema.json +3 -3
- package/src/scripts/schemas/review-findings.schema.json +8 -0
- package/src/scripts/schemas/skill.schema.json +7 -6
- package/src/scripts/schemas/subagent.schema.json +33 -2
- package/src/scripts/score_skill_selection.ts +5 -2
- package/src/scripts/second_brain_retrieval.ts +1 -0
- package/src/scripts/second_brain_run.ts +1 -0
- package/src/scripts/self_repair_cli.ts +563 -87
- package/src/scripts/self_review_gate.ts +59 -4
- package/src/scripts/session_register_hook.ts +91 -4
- package/src/scripts/sessions_cli.ts +100 -5
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +31 -2
- package/src/scripts/skill_trigger_eval.ts +4 -2
- package/src/scripts/source_adapters.ts +183 -0
- package/src/scripts/step_receipt.ts +100 -0
- package/src/scripts/sync_pr_branch.ts +4 -0
- package/src/scripts/test_council_qualification.ts +1 -1
- package/src/scripts/trigger_eval_grandfather.json +3 -49
- package/src/scripts/trigger_eval_rotation.ts +31 -3
- package/src/scripts/ui_conformance_probe.ts +405 -1
- package/src/scripts/update_counts.ts +230 -11
- package/src/scripts/update_invite_hook.ts +245 -0
- package/src/scripts/update_notice_hook.ts +298 -0
- package/src/scripts/validate_frontmatter.ts +85 -0
- package/src/scripts/worker_reuse_shadow_report.ts +519 -0
- package/src/scripts/worktree_cleanup_check.ts +915 -121
- package/src/server/io/yamlIO.ts +2 -2
- package/src/server/schemas/settings.ts +37 -23
- package/src/shared/brandTokenDocument.ts +46 -0
- package/src/shared/brandTokenPaths.ts +43 -0
- package/src/shared/settingsCarveOut.ts +0 -8
- package/src/shared/skillRanking.ts +106 -5
- package/src/shared/userMd/formAdapter.ts +15 -1
- package/src/shared/userMd/schema.ts +22 -0
- package/src/templates/agent-user.md +4 -0
- package/src/templates/agent-user.yml +4 -0
- package/dist/cli-delegate/chunk-4DBG5K7M.js +0 -1123
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
- package/dist/cli-delegate/chunk-A4QJ6ENT.js +0 -50
- package/dist/cli-delegate/chunk-AL3RZ22D.js +0 -74
- package/dist/cli-delegate/chunk-KB5FZ655.js +0 -208
- package/dist/cli-delegate/chunk-MDPPKQCQ.js +0 -875
- package/dist/cli-delegate/chunk-OAFSJBHH.js +0 -272
- package/dist/ui/assets/index-C3djEJah.js +0 -23
- package/src/scripts/_lib/continuation_ladder.ts +0 -335
- package/src/scripts/hooks/run_continuation_hook.ts +0 -1524
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* The egress engine's invariants survive no listed mutation
|
|
4
|
+
* (road-to-one-detector-and-the-senders-we-own 2.6).
|
|
5
|
+
*
|
|
6
|
+
* Every recipe under `src/config/egress-mutations/` names one engine module, a
|
|
7
|
+
* `find` text that must occur in it exactly once, its `replace`, and the
|
|
8
|
+
* invariant that must kill it. For each recipe the three engine modules
|
|
9
|
+
* (`egress_rules`, `egress_token`, `egress_text`) are copied into a scratch
|
|
10
|
+
* directory — never edited in place — and the invariant is run twice: on the
|
|
11
|
+
* unmutated copy, where it must hold, and on the mutated copy, where it must
|
|
12
|
+
* fail. A recipe whose mutation survives, whose `find` text is gone, or whose
|
|
13
|
+
* invariant fails on the unmutated engine fails the gate.
|
|
14
|
+
*
|
|
15
|
+
* Exit: 0 every mutation killed · 1 a mutation survived or a recipe is stale.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import * as fs from 'node:fs';
|
|
19
|
+
import * as os from 'node:os';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
22
|
+
|
|
23
|
+
import type * as Rules from './_lib/egress_rules.js';
|
|
24
|
+
import type * as Text from './_lib/egress_text.js';
|
|
25
|
+
import type * as Token from './_lib/egress_token.js';
|
|
26
|
+
import { runGateCli, runSelfTest } from './_lib/gate_self_test.js';
|
|
27
|
+
import { reportScanned } from './_lib/scan_scope.js';
|
|
28
|
+
|
|
29
|
+
const GATE = 'check_egress_mutations';
|
|
30
|
+
const REPO_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
31
|
+
export const RECIPE_DIR = 'src/config/egress-mutations';
|
|
32
|
+
export const ENGINE_MODULES: readonly string[] = [
|
|
33
|
+
'src/scripts/_lib/egress_rules.ts',
|
|
34
|
+
'src/scripts/_lib/egress_token.ts',
|
|
35
|
+
'src/scripts/_lib/egress_text.ts',
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
export interface Recipe {
|
|
39
|
+
readonly mutation: string;
|
|
40
|
+
readonly module: string;
|
|
41
|
+
readonly find: string;
|
|
42
|
+
readonly replace: string;
|
|
43
|
+
readonly killed_by: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface EngineMods {
|
|
47
|
+
readonly rules: typeof Rules;
|
|
48
|
+
readonly token: typeof Token;
|
|
49
|
+
readonly text: typeof Text;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Built at runtime so no credential literal sits in this file.
|
|
53
|
+
const PAT = ['ghp', 'Qw3Er5Ty7Ui9Op2As4Df6Gh8Jk1Lz3Xc5Vb7'].join('_');
|
|
54
|
+
// The registry's own example IBAN, and the same digits under a wrong check pair.
|
|
55
|
+
const IBAN_BODY = '370400440532013000';
|
|
56
|
+
|
|
57
|
+
/** Each returns true when the invariant holds on the engine it is given. */
|
|
58
|
+
export const INVARIANTS: Readonly<Record<string, (m: EngineMods) => boolean>> = {
|
|
59
|
+
'credential-outranks-identifier': (m) => {
|
|
60
|
+
const kept = m.rules.resolveOverlaps([
|
|
61
|
+
{ rule: 'id', type: 'EMAIL', class: 'identifier', start: 0, end: 20, validated: true },
|
|
62
|
+
{ rule: 'cred', type: 'TOKEN', class: 'credential', start: 5, end: 10, validated: false },
|
|
63
|
+
]);
|
|
64
|
+
return kept.length === 1 && kept[0]?.class === 'credential';
|
|
65
|
+
},
|
|
66
|
+
'credential-token-never-restores': (m) => {
|
|
67
|
+
const scope = new m.token.TokenScope();
|
|
68
|
+
const out = m.token.replaceValues(`key ${PAT} here`, scope);
|
|
69
|
+
const tokens = m.token.parseTokens(out);
|
|
70
|
+
return tokens.length === 1 && tokens.every((t) => scope.resolve(out.slice(t.start, t.end)) === null);
|
|
71
|
+
},
|
|
72
|
+
'iban-checksum-refuses-a-wrong-check-digit': (m) => {
|
|
73
|
+
const wrong = `DE88${IBAN_BODY}`;
|
|
74
|
+
return (
|
|
75
|
+
m.rules.isValidIban(`DE89${IBAN_BODY}`) &&
|
|
76
|
+
!m.rules.isValidIban(wrong) &&
|
|
77
|
+
!m.rules.detect(`IBAN ${wrong}`).some((s) => s.type === 'IBAN')
|
|
78
|
+
);
|
|
79
|
+
},
|
|
80
|
+
'tally-carries-no-value': (m) => {
|
|
81
|
+
const tally = m.text.tallyText(`key ${PAT} here`);
|
|
82
|
+
return tally.found.length === 1 && !JSON.stringify(tally).includes(PAT);
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export function readRecipes(root: string): Recipe[] {
|
|
87
|
+
const dir = path.join(root, RECIPE_DIR);
|
|
88
|
+
if (!fs.existsSync(dir)) return [];
|
|
89
|
+
return fs
|
|
90
|
+
.readdirSync(dir)
|
|
91
|
+
.filter((f) => f.endsWith('.json'))
|
|
92
|
+
.sort()
|
|
93
|
+
.map((f) => JSON.parse(fs.readFileSync(path.join(dir, f), 'utf-8')) as Recipe);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async function loadEngine(root: string, mutate?: Recipe): Promise<EngineMods> {
|
|
97
|
+
// The copies sit in one flat directory, so the engine's import closure must
|
|
98
|
+
// be exactly ENGINE_MODULES; a sibling import would not resolve there and
|
|
99
|
+
// would read as "invariant fails on the unmutated engine".
|
|
100
|
+
const copied = new Set(ENGINE_MODULES.map((rel) => path.basename(rel).replace(/\.ts$/, '.js')));
|
|
101
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'egress-mutation-'));
|
|
102
|
+
try {
|
|
103
|
+
for (const rel of ENGINE_MODULES) {
|
|
104
|
+
let src = fs.readFileSync(path.join(root, rel), 'utf-8');
|
|
105
|
+
for (const m of src.matchAll(/from\s+'(\.\.?\/[^']+)'/g)) {
|
|
106
|
+
const spec = m[1] as string;
|
|
107
|
+
if (!spec.startsWith('./') || !copied.has(spec.slice(2))) {
|
|
108
|
+
throw new Error(`${rel} imports ${spec}, which is outside the copied engine modules — add it to ENGINE_MODULES`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (mutate !== undefined && rel === mutate.module) src = src.replace(mutate.find, () => mutate.replace);
|
|
112
|
+
fs.writeFileSync(path.join(tmp, path.basename(rel)), src);
|
|
113
|
+
}
|
|
114
|
+
const at = (name: string): string => pathToFileURL(path.join(tmp, name)).href;
|
|
115
|
+
return {
|
|
116
|
+
rules: (await import(at('egress_rules.ts'))) as EngineMods['rules'],
|
|
117
|
+
token: (await import(at('egress_token.ts'))) as EngineMods['token'],
|
|
118
|
+
text: (await import(at('egress_text.ts'))) as EngineMods['text'],
|
|
119
|
+
};
|
|
120
|
+
} finally {
|
|
121
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const holds = (inv: (m: EngineMods) => boolean, m: EngineMods): boolean => {
|
|
126
|
+
try {
|
|
127
|
+
return inv(m);
|
|
128
|
+
} catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
/** One finding per recipe that does not do its job; empty when every mutation is killed. */
|
|
134
|
+
export async function findSurvivors(root: string, recipes: readonly Recipe[]): Promise<string[]> {
|
|
135
|
+
const out: string[] = [];
|
|
136
|
+
for (const r of recipes) {
|
|
137
|
+
const inv = INVARIANTS[r.killed_by];
|
|
138
|
+
if (inv === undefined) {
|
|
139
|
+
out.push(`${r.mutation}: no invariant named ${r.killed_by}`);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (!ENGINE_MODULES.includes(r.module)) {
|
|
143
|
+
out.push(`${r.mutation}: ${r.module} is not an engine module`);
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const src = fs.readFileSync(path.join(root, r.module), 'utf-8');
|
|
147
|
+
if (src.split(r.find).length !== 2) {
|
|
148
|
+
out.push(`${r.mutation}: its find text does not occur exactly once in ${r.module} — the recipe is stale`);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (!holds(inv, await loadEngine(root))) {
|
|
152
|
+
out.push(`${r.mutation}: ${r.killed_by} fails on the unmutated engine`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (holds(inv, await loadEngine(root, r))) out.push(`${r.mutation}: survived — ${r.killed_by} still holds`);
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export async function check(root: string): Promise<number> {
|
|
161
|
+
const recipes = readRecipes(root);
|
|
162
|
+
reportScanned({ gate: GATE, scanned: recipes.length, units: 'mutation recipe(s)', roots: [RECIPE_DIR] });
|
|
163
|
+
const survivors = await findSurvivors(root, recipes);
|
|
164
|
+
if (survivors.length > 0) {
|
|
165
|
+
process.stderr.write(`❌ ${GATE}: a mutation of the egress engine was not killed:\n`);
|
|
166
|
+
for (const s of survivors) process.stderr.write(` · ${s}\n`);
|
|
167
|
+
return 1;
|
|
168
|
+
}
|
|
169
|
+
process.stdout.write(`✅ ${GATE}: every mutation killed (${String(recipes.length)} recipe(s)).\n`);
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function selfTest(): number {
|
|
174
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'egress-mutations-selftest-'));
|
|
175
|
+
const fixture = (name: string, recipes: readonly Recipe[]): string => {
|
|
176
|
+
const root = path.join(tmp, name);
|
|
177
|
+
for (const rel of ENGINE_MODULES) {
|
|
178
|
+
fs.mkdirSync(path.join(root, path.dirname(rel)), { recursive: true });
|
|
179
|
+
fs.copyFileSync(path.join(REPO_ROOT, rel), path.join(root, rel));
|
|
180
|
+
}
|
|
181
|
+
fs.mkdirSync(path.join(root, RECIPE_DIR), { recursive: true });
|
|
182
|
+
recipes.forEach((r, i) => fs.writeFileSync(path.join(root, RECIPE_DIR, `${String(i)}.json`), JSON.stringify(r)));
|
|
183
|
+
return root;
|
|
184
|
+
};
|
|
185
|
+
const real = readRecipes(REPO_ROOT);
|
|
186
|
+
const first = real[0] as Recipe;
|
|
187
|
+
const run = (root: string): number => runGateCli(REPO_ROOT, 'src/scripts/check_egress_mutations.ts', ['--root', root], root);
|
|
188
|
+
try {
|
|
189
|
+
return runSelfTest({
|
|
190
|
+
gate: GATE,
|
|
191
|
+
minCases: 4,
|
|
192
|
+
minRejectCases: 3,
|
|
193
|
+
cases: [
|
|
194
|
+
{
|
|
195
|
+
name: 'a mutation that changes nothing survives and is rejected',
|
|
196
|
+
expect: 'reject',
|
|
197
|
+
run: () => run(fixture('survivor', [{ ...first, mutation: 'noop', replace: first.find }])),
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
name: 'a recipe whose find text is gone is rejected as stale',
|
|
201
|
+
expect: 'reject',
|
|
202
|
+
run: () => run(fixture('stale', [{ ...first, mutation: 'stale', find: 'no such text in the module' }])),
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
name: 'a recipe naming no known invariant is rejected',
|
|
206
|
+
expect: 'reject',
|
|
207
|
+
run: () => run(fixture('unknown', [{ ...first, mutation: 'unknown', killed_by: 'no-such-invariant' }])),
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: 'the committed recipes are all killed',
|
|
211
|
+
expect: 'accept',
|
|
212
|
+
run: () => run(fixture('real', real)),
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
});
|
|
216
|
+
} finally {
|
|
217
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export async function main(argv: readonly string[]): Promise<number> {
|
|
222
|
+
if (argv.includes('--help') || argv.includes('-h')) {
|
|
223
|
+
process.stdout.write(`usage: ${GATE} [--root DIR] [--self-test]\n`);
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
if (argv.includes('--self-test')) return selfTest();
|
|
227
|
+
const i = argv.indexOf('--root');
|
|
228
|
+
return check(i === -1 ? REPO_ROOT : (argv[i + 1] ?? REPO_ROOT));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
|
|
232
|
+
main(process.argv.slice(2)).then(
|
|
233
|
+
(code) => process.exit(code),
|
|
234
|
+
(exc: unknown) => {
|
|
235
|
+
process.stderr.write(`${GATE}: ${String(exc)}\n`);
|
|
236
|
+
process.exit(2);
|
|
237
|
+
},
|
|
238
|
+
);
|
|
239
|
+
}
|
|
@@ -414,11 +414,24 @@ export function strip_comments(src: string): string {
|
|
|
414
414
|
.join('\n');
|
|
415
415
|
}
|
|
416
416
|
|
|
417
|
-
/**
|
|
417
|
+
/**
|
|
418
|
+
* True when `base`/`stem` appears inside a quoted specifier — an invocation shape.
|
|
419
|
+
*
|
|
420
|
+
* This answers exactly what `/['"\`][^'"\`]*NEEDLE[^'"\`]*['"\`]/` answered —
|
|
421
|
+
* an occurrence with some quote character before it and some after it — without
|
|
422
|
+
* compiling two regexes per script per round over a body that reaches megabytes.
|
|
423
|
+
* That sweep was ~99 % of `build_proof`'s `render()` (88 s of 89 s locally,
|
|
424
|
+
* CPU profile 2026-10-21). The regex is kept as the oracle in
|
|
425
|
+
* `check_enforcement_coverage_mentions.test.ts`.
|
|
426
|
+
*/
|
|
418
427
|
export function mentions_as_code(haystack: string, base: string, stem: string): boolean {
|
|
428
|
+
const firsts = ["'", '"', '`'].map((q) => haystack.indexOf(q)).filter((i) => i !== -1);
|
|
429
|
+
if (firsts.length === 0) return false;
|
|
430
|
+
const first = Math.min(...firsts);
|
|
431
|
+
const last = Math.max(...["'", '"', '`'].map((q) => haystack.lastIndexOf(q)));
|
|
419
432
|
for (const needle of [base, stem]) {
|
|
420
|
-
const
|
|
421
|
-
if (
|
|
433
|
+
const at = haystack.indexOf(needle, first + 1);
|
|
434
|
+
if (at !== -1 && at + needle.length <= last) return true;
|
|
422
435
|
}
|
|
423
436
|
return false;
|
|
424
437
|
}
|
|
@@ -154,7 +154,7 @@ import { resolveBaseRef } from './_lib/ratchet_base_ref.js';
|
|
|
154
154
|
import { materialiseSubtree } from './_lib/base_tree.js';
|
|
155
155
|
import { SKILLS_POSIX, measureSkillEstate } from './_lib/skill_estate.js';
|
|
156
156
|
import { CONCERN_MANIFEST_POSIX, countConcerns } from './_lib/concern_estate.js';
|
|
157
|
-
import { exemptionFindings, type ExemptionFinding } from './_lib/exemption_shape.js';
|
|
157
|
+
import { exemptionFindings, unsearchedExemptions, type ExemptionFinding } from './_lib/exemption_shape.js';
|
|
158
158
|
import { classifyDiff, growthClaims, type GrowthClaim, type OffsetLedger } from './_lib/estate_offsets.js';
|
|
159
159
|
import { runGateCli, runSelfTest, type SelfTestCase } from './_lib/gate_self_test.js';
|
|
160
160
|
|
|
@@ -344,6 +344,8 @@ export interface EstateVerdict {
|
|
|
344
344
|
* another added file's. Empty on every change that adds no exemption.
|
|
345
345
|
*/
|
|
346
346
|
exemptionFindings: ExemptionFinding[];
|
|
347
|
+
/** Added exemptions quoting no owner search — reported, never gating (council 2026-10-16). */
|
|
348
|
+
exemptionWarnings: ExemptionFinding[];
|
|
347
349
|
/**
|
|
348
350
|
* Roadmaps carrying an unscheduled status — REPORTED, never gated.
|
|
349
351
|
*
|
|
@@ -793,6 +795,7 @@ export function evaluate(
|
|
|
793
795
|
offsetSkipReason,
|
|
794
796
|
unpaid,
|
|
795
797
|
exemptionFindings: findings,
|
|
798
|
+
exemptionWarnings: offsets === null ? [] : unsearchedExemptions(offsets.exempt),
|
|
796
799
|
draftRoadmaps: countDrafts(repoRoot),
|
|
797
800
|
provisionalPromotion,
|
|
798
801
|
// No floor is a FAILURE, not a skip, and it is the one place this gate
|
|
@@ -1412,6 +1415,18 @@ export function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
1412
1415
|
);
|
|
1413
1416
|
}
|
|
1414
1417
|
}
|
|
1418
|
+
for (const f of verdict.exemptionWarnings) {
|
|
1419
|
+
process.stderr.write(
|
|
1420
|
+
`⚠️ ${f.file}: estate_offset_exempt quotes no owner search (report-only).\n` +
|
|
1421
|
+
` reason: ${f.reason.slice(0, 160)}\n` +
|
|
1422
|
+
' Before a finding becomes a new file, search for the roadmap that already\n' +
|
|
1423
|
+
' owns it and quote the search in one clause: the command, what it searched\n' +
|
|
1424
|
+
' for, the whole tree as scope and an empty result, e.g. "a grep over\n' +
|
|
1425
|
+
' agents/roadmaps/{*,later,stubs} for <identifiers> returns nothing". If the\n' +
|
|
1426
|
+
' search finds an owner, land the finding there as a step and an `Arrivals:`\n' +
|
|
1427
|
+
' line instead. Added files only; this does not fail the gate.\n',
|
|
1428
|
+
);
|
|
1429
|
+
}
|
|
1415
1430
|
ledger.report();
|
|
1416
1431
|
if (verdict.withinBudget) {
|
|
1417
1432
|
process.stdout.write(`✅ ${GATE}: estate within its ratchet.\n`);
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* mutable and unaudited; it is transport, not a record). Every blocking
|
|
12
12
|
* finding in the ledger (see `isBlocking`) must carry a complete disposition
|
|
13
13
|
* `{status: fixed|false_positive|accepted_risk, commit (when fixed),
|
|
14
|
-
* rationale, verified_by}
|
|
14
|
+
* rationale, verified_by}` when the gate is run.
|
|
15
15
|
*
|
|
16
16
|
* Modes:
|
|
17
17
|
* --release X.Y.Z [--dir <ledger dir>] validate the committed ledger
|
|
@@ -24,50 +24,28 @@
|
|
|
24
24
|
* self_review_gate --findings-out) into the ledger with an empty
|
|
25
25
|
* disposition, so validation is red until a human fills it.
|
|
26
26
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* undeterminable the tag list cannot settle it and no remote answered ->
|
|
37
|
-
* exit 2. Refusing beats passing: a silent green here is the
|
|
38
|
-
* very inversion this split exists to remove
|
|
39
|
-
*
|
|
40
|
-
* THE SOURCE IS THE TAG / RELEASE, AND DELIBERATELY NOT `CHANGELOG.md`. The
|
|
41
|
-
* changelog heading is written by the release PR itself — gh pr diff 1836 shows
|
|
42
|
-
* "+## [14.16.0](...)" inside the release commit — so on branch release/X the
|
|
43
|
-
* changelog claims X is released before X exists. Reading it would redden every
|
|
44
|
-
* in-flight release branch over a file nobody could yet have written, which is
|
|
45
|
-
* the exact behaviour this split is here to preserve. The tag is created at
|
|
46
|
-
* publish, after merge, so it cannot make that mistake.
|
|
47
|
-
*
|
|
48
|
-
* A local tag MISS is not authoritative on its own: actions/checkout fetches
|
|
49
|
-
* depth 1 and no tags by default, and the one workflow that runs this gate does
|
|
50
|
-
* not override either, so in CI the local tag list is EMPTY. See releaseStatus
|
|
51
|
-
* for the asymmetry and the remote fallback.
|
|
52
|
-
*
|
|
53
|
-
* AN EMPTY LEDGER MUST SAY WHY IT IS EMPTY. The released/unreleased split above
|
|
54
|
-
* closed the missing-file half; it left the other half open, because
|
|
55
|
-
* `findings: []` still passed while asserting nothing. A writer could satisfy
|
|
27
|
+
* AN ABSENT LEDGER IS NOT A FAILURE (owner, 2026-10-22). A release waits for
|
|
28
|
+
* no review ledger, because every commit on main is already reviewed and
|
|
29
|
+
* merged; the 17.0.0 cut stopped for a day on a ledger whose self-review never
|
|
30
|
+
* finished. No release workflow waits for this check, and an absent ledger
|
|
31
|
+
* passes, shipped or not. The consistency coverage guard still executes it,
|
|
32
|
+
* so any committed ledger must remain valid.
|
|
33
|
+
*
|
|
34
|
+
* AN EMPTY LEDGER MUST SAY WHY IT IS EMPTY. A ledger that exists is a record,
|
|
35
|
+
* and `findings: []` used to pass while asserting nothing. A writer could satisfy
|
|
56
36
|
* the gate by creating an empty file, which is the same silence wearing the
|
|
57
37
|
* shape of a record. `no_findings_reason` is now required whenever the file
|
|
58
38
|
* exists and the array is empty — see empty_ledger_problem for what the reason
|
|
59
39
|
* has to distinguish.
|
|
60
40
|
*
|
|
61
41
|
* A future reader changing allowEmpty below is the person this is addressed to:
|
|
62
|
-
* the EMPTY_VALID waiver
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* undeterminable release status. Deliberately NOT fail-open: this script never calls a model;
|
|
70
|
-
* a broken ledger file is a hard error, not a neutral skip.
|
|
42
|
+
* the EMPTY_VALID waiver covers an absent ledger and an EXPLAINED empty one. It
|
|
43
|
+
* does not cover an empty ledger with no reason.
|
|
44
|
+
*
|
|
45
|
+
* Exit codes: 0 complete or no ledger · 1 missing/incomplete dispositions (an
|
|
46
|
+
* unexplained empty ledger among them) · 2 usage error or schema error.
|
|
47
|
+
* Deliberately NOT fail-open: this script never calls a model; a broken ledger
|
|
48
|
+
* file is a hard error, not a neutral skip.
|
|
71
49
|
*/
|
|
72
50
|
import { spawnSync } from 'node:child_process';
|
|
73
51
|
import * as fs from 'node:fs';
|
|
@@ -139,6 +117,13 @@ export interface Ledger {
|
|
|
139
117
|
context_relation?: string;
|
|
140
118
|
acceptance_status?: string;
|
|
141
119
|
assurance?: string;
|
|
120
|
+
/**
|
|
121
|
+
* Repo-relative path to a committed owner directive that permits cutting
|
|
122
|
+
* this version although nothing reviewed it. A PATH rather than free text:
|
|
123
|
+
* free text is the reason string this field exists to stop being enough.
|
|
124
|
+
* See unreviewed_ledger_problem.
|
|
125
|
+
*/
|
|
126
|
+
assurance_override?: string;
|
|
142
127
|
reviewers?: string[];
|
|
143
128
|
coverage?: unknown;
|
|
144
129
|
/**
|
|
@@ -483,6 +468,110 @@ export function empty_ledger_problem(
|
|
|
483
468
|
export type ReleaseStatus = 'released' | 'unreleased' | 'undeterminable';
|
|
484
469
|
export type RemoteReleaseAnswer = 'released' | 'unreleased' | 'unavailable';
|
|
485
470
|
|
|
471
|
+
/**
|
|
472
|
+
* A version named as a whole token: `16.4.1` does not occur in `16.4.10` or in
|
|
473
|
+
* `116.4.1`, which a substring test would accept.
|
|
474
|
+
*/
|
|
475
|
+
export function mentionsVersion(text: string, release: string): boolean {
|
|
476
|
+
const escaped = release.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
477
|
+
return new RegExp(`(?<![\\w.-])v?${escaped}(?![\\w-]|\\.\\d)`).test(text);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/** Where an `assurance_override` may point. Nothing outside it is accepted. */
|
|
481
|
+
export const OWNER_DIRECTIVES_DIR = 'agents/evidence/owner-directives';
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* A review that never ran is not a review, and a reason string is not one either.
|
|
485
|
+
*
|
|
486
|
+
* `empty_ledger_problem` above forced an empty ledger to SAY why it is empty. It
|
|
487
|
+
* could not ask whether the answer was acceptable, because any non-empty reason
|
|
488
|
+
* satisfies it — so a ledger declaring `assurance: unreviewed` beside a reason
|
|
489
|
+
* whose own first words are "NOT REVIEWED" cleared the cut. That is the state
|
|
490
|
+
* 16.4.0 shipped in: three self-review runs refused by the provider, nothing
|
|
491
|
+
* reviewed, and a release tagged anyway on the strength of the paragraph saying
|
|
492
|
+
* so. The paragraph was honest; what was missing was anything that read it.
|
|
493
|
+
*
|
|
494
|
+
* Two bounds keep this from reddening work it has no business reddening.
|
|
495
|
+
*
|
|
496
|
+
* SCOPED TO AN UNRELEASED VERSION. Backfilled ledgers for versions that already
|
|
497
|
+
* shipped carry `unreviewed` by design — that is what a backfill IS — and a
|
|
498
|
+
* version-blind refusal would red history nobody can go back and re-review. An
|
|
499
|
+
* `undeterminable` status passes for the same reason read from the other side:
|
|
500
|
+
* a checkout that cannot say whether a version shipped cannot say the ledger is
|
|
501
|
+
* a backfill either, and refusing there would turn a tagless clone into a
|
|
502
|
+
* blocked release. The cut itself runs where tags are complete.
|
|
503
|
+
*
|
|
504
|
+
* THE OVERRIDE IS A PATH, NOT A SENTENCE. It names a committed file under
|
|
505
|
+
* {@link OWNER_DIRECTIVES_DIR} whose text names the version — so the escape
|
|
506
|
+
* hatch leaves an artifact somebody signed, which a free-text field does not.
|
|
507
|
+
* `readDirective` is injected so both halves of that check are decidable
|
|
508
|
+
* offline, the way every signal in `releaseStatus` is.
|
|
509
|
+
*/
|
|
510
|
+
export function unreviewed_ledger_problem(
|
|
511
|
+
ledger: Pick<Ledger, 'findings' | 'assurance' | 'assurance_override'>,
|
|
512
|
+
release: string,
|
|
513
|
+
status: ReleaseStatus,
|
|
514
|
+
readDirective: (relPath: string) => string | null,
|
|
515
|
+
): string | null {
|
|
516
|
+
if (ledger.findings.length > 0) {
|
|
517
|
+
return null;
|
|
518
|
+
}
|
|
519
|
+
if ((ledger.assurance ?? '').trim() !== 'unreviewed') {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
const override = (ledger.assurance_override ?? '').trim();
|
|
523
|
+
// Checked before the status, and deliberately: an override pointing at
|
|
524
|
+
// nothing is wrong on a released version too, and a reader who wrote one
|
|
525
|
+
// is owed the reason rather than a silent pass.
|
|
526
|
+
if (override !== '') {
|
|
527
|
+
// Normalised first: a prefix test on the raw value admits
|
|
528
|
+
// `owner-directives/../../CHANGELOG.md`, which names any file at all.
|
|
529
|
+
const normalised = path.posix.normalize(override);
|
|
530
|
+
if (
|
|
531
|
+
normalised !== override
|
|
532
|
+
|| override.split('/').includes('..')
|
|
533
|
+
|| !override.startsWith(`${OWNER_DIRECTIVES_DIR}/`)
|
|
534
|
+
) {
|
|
535
|
+
return (
|
|
536
|
+
`\`assurance_override\` is \`${override}\`, which is not under `
|
|
537
|
+
+ `${OWNER_DIRECTIVES_DIR}/. The override names a committed owner directive, `
|
|
538
|
+
+ 'never a sentence — a sentence is the reason string this field replaces.'
|
|
539
|
+
);
|
|
540
|
+
}
|
|
541
|
+
const text = readDirective(override);
|
|
542
|
+
if (text === null) {
|
|
543
|
+
return (
|
|
544
|
+
`\`assurance_override\` names ${override}, which is not committed. `
|
|
545
|
+
+ 'Commit the directive, or remove the override and get the ledger reviewed.'
|
|
546
|
+
);
|
|
547
|
+
}
|
|
548
|
+
if (!mentionsVersion(text, release)) {
|
|
549
|
+
return (
|
|
550
|
+
`\`assurance_override\` names ${override}, whose text does not mention `
|
|
551
|
+
+ `${release}. A directive permitting some other cut does not permit this one.`
|
|
552
|
+
);
|
|
553
|
+
}
|
|
554
|
+
return null;
|
|
555
|
+
}
|
|
556
|
+
if (status !== 'unreleased') {
|
|
557
|
+
return null;
|
|
558
|
+
}
|
|
559
|
+
return (
|
|
560
|
+
`the ledger declares \`assurance: unreviewed\` with no findings, so nothing reviewed `
|
|
561
|
+
+ `${release} and this cut would ship a release that reviewed itself not at all.\n`
|
|
562
|
+
+ ' Review it. The self-review gate resolves the local subscription CLI before any\n'
|
|
563
|
+
+ ' metered key, so a review is usually one command away and needs no credit:\n'
|
|
564
|
+
+ ' ./scripts-run src/scripts/self_review_gate --findings-out agents/runtime/release-findings.json\n'
|
|
565
|
+
+ ' Then ingest what it reported:\n'
|
|
566
|
+
+ ' ./scripts-run src/scripts/check_finding_dispositions --ingest '
|
|
567
|
+
+ `agents/runtime/release-findings.json --release ${release}\n`
|
|
568
|
+
+ ' If this cut must go out unreviewed, that is an owner decision and it leaves a\n'
|
|
569
|
+
+ ` file: commit a directive under ${OWNER_DIRECTIVES_DIR}/ whose text names `
|
|
570
|
+
+ `${release},\n`
|
|
571
|
+
+ ' and set `assurance_override` to its path.'
|
|
572
|
+
);
|
|
573
|
+
}
|
|
574
|
+
|
|
486
575
|
/**
|
|
487
576
|
* Pure core of the released-vs-unreleased discriminator. Every signal is
|
|
488
577
|
* INJECTED, so both directions AND the degradation are testable offline. A
|
|
@@ -542,6 +631,21 @@ function _git(args: readonly string[]): { ok: boolean; out: string } {
|
|
|
542
631
|
return { ok: r.status === 0, out: (r.stdout ?? '').trim() };
|
|
543
632
|
}
|
|
544
633
|
|
|
634
|
+
/**
|
|
635
|
+
* A file as committed at HEAD, or null. The working tree is not read: an
|
|
636
|
+
* uncommitted directive is exactly what the override's error calls "not
|
|
637
|
+
* committed", and only a regular blob counts — a symlink or submodule entry
|
|
638
|
+
* would let the path name content stored somewhere else.
|
|
639
|
+
*/
|
|
640
|
+
function readCommittedFile(rel: string): string | null {
|
|
641
|
+
const entry = _git(['ls-tree', 'HEAD', '--', rel]);
|
|
642
|
+
if (!entry.ok || !/^100(644|755) blob /.test(entry.out.trim())) {
|
|
643
|
+
return null;
|
|
644
|
+
}
|
|
645
|
+
const shown = _git(['show', `HEAD:${rel}`]);
|
|
646
|
+
return shown.ok ? shown.out : null;
|
|
647
|
+
}
|
|
648
|
+
|
|
545
649
|
/** This repository tags. A git failure is an empty list, i.e. not complete. */
|
|
546
650
|
export function git_tags(): string[] {
|
|
547
651
|
const r = _git(['tag', '--list']);
|
|
@@ -735,7 +839,7 @@ function main(argv: readonly string[]): number {
|
|
|
735
839
|
fs.writeFileSync(ledgerPath, JSON.stringify(ledger, null, 2) + '\n');
|
|
736
840
|
process.stdout.write(
|
|
737
841
|
`📥 ingested ${added} new finding(s) into ${path.relative(REPO_ROOT, ledgerPath)} — ` +
|
|
738
|
-
'fill dispositions
|
|
842
|
+
'fill dispositions by hand; no release waits for them\n',
|
|
739
843
|
);
|
|
740
844
|
if (carried.length > 0) {
|
|
741
845
|
process.stdout.write(` carried integrity fields: ${carried.join(', ')}\n`);
|
|
@@ -757,30 +861,9 @@ function main(argv: readonly string[]): number {
|
|
|
757
861
|
return 0;
|
|
758
862
|
}
|
|
759
863
|
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
process.stderr.write(
|
|
764
|
-
`❌ ${release} has shipped and carries no findings ledger at `
|
|
765
|
-
+ `${path.relative(REPO_ROOT, ledgerPath)}.\n`
|
|
766
|
-
+ ' Absence is not evidence of zero — the release PR\'s self-review may have\n'
|
|
767
|
-
+ ' reported findings that were never ingested. Recover the machine block and:\n'
|
|
768
|
-
+ ` ./scripts-run src/scripts/check_finding_dispositions --ingest <findings.json> --release ${release}\n`,
|
|
769
|
-
);
|
|
770
|
-
return 1;
|
|
771
|
-
}
|
|
772
|
-
if (status === 'undeterminable') {
|
|
773
|
-
process.stderr.write(
|
|
774
|
-
`❌ cannot determine whether ${release} has shipped: this checkout tag list is`
|
|
775
|
-
+ ' incomplete (shallow or tagless) and no remote answered.\n'
|
|
776
|
-
+ ' Refusing to pass on an absent ledger without knowing — that silent green is\n'
|
|
777
|
-
+ ' the defect this check replaces. Fetch tags (actions/checkout fetch-tags: true)\n'
|
|
778
|
-
+ ' or make the gh CLI available.\n',
|
|
779
|
-
);
|
|
780
|
-
return 2;
|
|
781
|
-
}
|
|
782
|
-
}
|
|
783
|
-
|
|
864
|
+
// An absent ledger is not a failure, shipped or not: a release waits for no
|
|
865
|
+
// review ledger, because everything on main is already reviewed and merged
|
|
866
|
+
// (owner, 2026-10-22). It reads as an empty ledger below.
|
|
784
867
|
let ledger: Ledger = { schema_version: 1, release, findings: [] };
|
|
785
868
|
if (fs.existsSync(ledgerPath)) {
|
|
786
869
|
try {
|
|
@@ -802,6 +885,27 @@ function main(argv: readonly string[]): number {
|
|
|
802
885
|
);
|
|
803
886
|
return 1;
|
|
804
887
|
}
|
|
888
|
+
// And an explained empty ledger must say something a reader can accept.
|
|
889
|
+
// The status is resolved ONLY on the branch that reads it — a ledger
|
|
890
|
+
// with findings, one that is not `unreviewed`, and one already carrying
|
|
891
|
+
// an override all skip the tag probe, so the ordinary cut stays exactly
|
|
892
|
+
// as cheap as it was.
|
|
893
|
+
const needsStatus =
|
|
894
|
+
ledger.findings.length === 0
|
|
895
|
+
&& (ledger.assurance ?? '').trim() === 'unreviewed'
|
|
896
|
+
&& (ledger.assurance_override ?? '').trim() === '';
|
|
897
|
+
const unreviewedProblem = unreviewed_ledger_problem(
|
|
898
|
+
ledger,
|
|
899
|
+
release,
|
|
900
|
+
needsStatus ? resolve_release_status(release) : 'undeterminable',
|
|
901
|
+
(rel) => readCommittedFile(rel),
|
|
902
|
+
);
|
|
903
|
+
if (unreviewedProblem !== null) {
|
|
904
|
+
process.stderr.write(
|
|
905
|
+
`❌ ${path.relative(REPO_ROOT, ledgerPath)}: ${unreviewedProblem}\n`,
|
|
906
|
+
);
|
|
907
|
+
return 1;
|
|
908
|
+
}
|
|
805
909
|
}
|
|
806
910
|
|
|
807
911
|
// Scope declaration, not a scope guard. The ledger is written per release by
|
|
@@ -818,15 +922,12 @@ function main(argv: readonly string[]): number {
|
|
|
818
922
|
units: 'recorded finding(s)',
|
|
819
923
|
roots: [path.relative(REPO_ROOT, ledgerPath)],
|
|
820
924
|
allowEmpty:
|
|
821
|
-
'EMPTY_VALID: zero recorded findings
|
|
822
|
-
+ '
|
|
823
|
-
+ '
|
|
824
|
-
+ '
|
|
825
|
-
+ '
|
|
826
|
-
+ '
|
|
827
|
-
+ 'remains is an EXPLAINED empty ledger and an unreleased version. Un-ingested '
|
|
828
|
-
+ 'findings on an in-flight release are caught by --pr (unrecorded_findings), '
|
|
829
|
-
+ 'never by this count.',
|
|
925
|
+
'EMPTY_VALID: zero recorded findings is a pass. A version with no ledger reads '
|
|
926
|
+
+ 'as empty, shipped or not, because a release waits for no review ledger '
|
|
927
|
+
+ '(owner, 2026-10-22). It does not cover an existing empty ledger that does not '
|
|
928
|
+
+ 'say why it is empty, which returns 1 above via empty_ledger_problem. '
|
|
929
|
+
+ 'Un-ingested findings are caught by --pr (unrecorded_findings), never by this '
|
|
930
|
+
+ 'count.',
|
|
830
931
|
});
|
|
831
932
|
} catch (exc) {
|
|
832
933
|
if (exc instanceof DeadScopeError) {
|