@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
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
* Spawn-guard — SHADOW ONLY (road-to-subagent-lifecycle-integrity Phase 3
|
|
4
4
|
* Step 1, activated per `docs/contracts/concern-activation-policy.md`).
|
|
5
5
|
*
|
|
6
|
-
* What it does: on every `Agent` / `Task`
|
|
7
|
-
* set the Phase-1 ledger maintains, and append one
|
|
8
|
-
* recording what a guard WOULD have done at several
|
|
9
|
-
*
|
|
6
|
+
* What it does: on every `Agent` / `Task` call and every resume (`SendMessage`),
|
|
7
|
+
* read the open-dispatch set the Phase-1 ledger maintains, and append one
|
|
8
|
+
* `spawn_guard_shadow` line recording what a guard WOULD have done at several
|
|
9
|
+
* candidate thresholds; a spawn also records whether a warm worker would have
|
|
10
|
+
* been re-tasked instead (`reuse`). It emits nothing to the model and it never
|
|
11
|
+
* blocks. Exit is always 0.
|
|
10
12
|
*
|
|
11
13
|
* ── Why shadow and not warn ───────────────────────────────────────────────
|
|
12
14
|
*
|
|
@@ -46,14 +48,29 @@
|
|
|
46
48
|
* rides along as context and becomes a real measurement only when Phase 0
|
|
47
49
|
* Step 4 establishes whether `agent_id` reaches a PreToolUse payload.
|
|
48
50
|
*
|
|
49
|
-
* PRIVACY BY CONSTRUCTION: counts
|
|
50
|
-
*
|
|
51
|
+
* PRIVACY BY CONSTRUCTION: counts, candidate verdicts, and a reuse verdict whose
|
|
52
|
+
* only free string is a worker's durable name from the register. A name read
|
|
53
|
+
* from the tool input reaches disk only as a session-bound digest. No prompt, no
|
|
54
|
+
* message, no recipient, no agent id.
|
|
51
55
|
*/
|
|
52
56
|
import * as fs from 'node:fs';
|
|
53
57
|
import * as path from 'node:path';
|
|
54
58
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
55
59
|
|
|
56
|
-
import {
|
|
60
|
+
import { probeHostCapabilities } from '../_lib/host_capability.js';
|
|
61
|
+
import { recentHostMarker } from '../_lib/quota_parked.js';
|
|
62
|
+
import { shadowReuseVerdict, type ReuseContext, type WorkerState } from '../_lib/worker_reuse.js';
|
|
63
|
+
import {
|
|
64
|
+
appendLedgerLine,
|
|
65
|
+
openRecordStats,
|
|
66
|
+
readIndexEntry,
|
|
67
|
+
readOpenRecords,
|
|
68
|
+
refFor,
|
|
69
|
+
resolveConsumerRoot,
|
|
70
|
+
stateStamp,
|
|
71
|
+
stopIndexKey,
|
|
72
|
+
writeIndexEntry,
|
|
73
|
+
} from './subagent_ledger_hook.js';
|
|
57
74
|
import { readHookStdin } from './hook_stdin.js';
|
|
58
75
|
import { EXIT_ALLOW } from './exit_codes.js';
|
|
59
76
|
|
|
@@ -67,6 +84,97 @@ function isObject(v: unknown): v is JsonObject {
|
|
|
67
84
|
/** The two subagent-dispatch tool names this repo has observed across hosts. */
|
|
68
85
|
export const DISPATCH_TOOL_NAMES: ReadonlySet<string> = new Set(['Agent', 'Task']);
|
|
69
86
|
|
|
87
|
+
/**
|
|
88
|
+
* The tool that re-tasks a finished worker — and also messages a running one,
|
|
89
|
+
* a teammate, or the lead. The host's concurrency cap checks new spawns only
|
|
90
|
+
* and admits a resume past it, so a guard that counted spawns only would
|
|
91
|
+
* undercount exactly the runs the host does not bound. Only a send the ledger
|
|
92
|
+
* can place on a finished leg is called a resume; see {@link classifySend}.
|
|
93
|
+
*/
|
|
94
|
+
export const RESUME_TOOL_NAMES: ReadonlySet<string> = new Set(['SendMessage']);
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* `resume` — the recipient hashes to a ledger ref that is not open and whose
|
|
98
|
+
* stop this same session recorded: a finished leg of this session is
|
|
99
|
+
* re-entered, which starts a run.
|
|
100
|
+
* `message_running` — the ref is open: the message starts no run.
|
|
101
|
+
* `message_or_resume` — the ledger cannot place the recipient in this session
|
|
102
|
+
* (a name, a teammate, the lead, another session's leg, no session id, a stop
|
|
103
|
+
* older than the scan window). Recorded, never called a resume.
|
|
104
|
+
*
|
|
105
|
+
* The verdict describes the attempted send at `pre_tool_use`; whether the host
|
|
106
|
+
* then accepts it is not visible here.
|
|
107
|
+
*/
|
|
108
|
+
export type SendKind = 'resume' | 'message_running' | 'message_or_resume';
|
|
109
|
+
|
|
110
|
+
/** Longer names are neither recorded nor resolved: a name is an address, not a payload. */
|
|
111
|
+
export const NAME_MAX = 128;
|
|
112
|
+
|
|
113
|
+
/** Domain-separated digest of (session, name); the only form a tool-input name takes on disk. */
|
|
114
|
+
function nameKey(sessionId: string, name: string): string {
|
|
115
|
+
return refFor(`subagent-name\0${sessionId}\0${name}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Classify one send. `recipient_kind: name` is resolved through the register a
|
|
120
|
+
* named spawn of this session left; any other recipient is taken as an agent id
|
|
121
|
+
* and hashed with the ledger's own `refFor`. Neither the recipient nor its ref
|
|
122
|
+
* is written.
|
|
123
|
+
*/
|
|
124
|
+
export function classifySend(
|
|
125
|
+
root: string,
|
|
126
|
+
toolInput: unknown,
|
|
127
|
+
sessionId: string | null,
|
|
128
|
+
now: Date = new Date(),
|
|
129
|
+
): SendKind {
|
|
130
|
+
const input = isObject(toolInput) ? toolInput : {};
|
|
131
|
+
const recipient = input['to'];
|
|
132
|
+
if (typeof recipient !== 'string' || recipient === '') return 'message_or_resume';
|
|
133
|
+
if (sessionId === null || sessionId === '') return 'message_or_resume';
|
|
134
|
+
const ref =
|
|
135
|
+
input['recipient_kind'] !== 'name'
|
|
136
|
+
? refFor(recipient)
|
|
137
|
+
: recipient.length > NAME_MAX
|
|
138
|
+
? null
|
|
139
|
+
: readIndexEntry(root, nameKey(sessionId, recipient), now);
|
|
140
|
+
if (!ref) return 'message_or_resume';
|
|
141
|
+
if (readOpenRecords(root).has(ref)) return 'message_running';
|
|
142
|
+
return readIndexEntry(root, stopIndexKey(sessionId, ref), now) === null ? 'message_or_resume' : 'resume';
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* On a completed named spawn, record which ledger ref the name now addresses.
|
|
147
|
+
* Neither the name nor the agent id reaches disk in clear; both are digested first.
|
|
148
|
+
*/
|
|
149
|
+
export function recordNamedSpawn(root: string, payload: JsonObject, sessionId: string | null, nowIso: string): void {
|
|
150
|
+
const input = isObject(payload['tool_input']) ? payload['tool_input'] : {};
|
|
151
|
+
const result = isObject(payload['tool_response']) ? payload['tool_response'] : {};
|
|
152
|
+
const name = input['name'];
|
|
153
|
+
const agentId = result['agentId'];
|
|
154
|
+
if (typeof name !== 'string' || name === '' || name.length > NAME_MAX || typeof agentId !== 'string' || agentId === '') return;
|
|
155
|
+
if (!sessionId) return;
|
|
156
|
+
const key = nameKey(sessionId, name);
|
|
157
|
+
appendLedgerLine(root, nowIso, { event: 'subagent_named', ts: nowIso, ref: refFor(agentId), name_key: key, session_id: sessionId });
|
|
158
|
+
writeIndexEntry(root, nowIso, key, refFor(agentId));
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Platforms where `pre_tool_use` was observed firing on the resume tool, with a
|
|
163
|
+
* deny honoured there. Elsewhere the line says the resume half is unobserved.
|
|
164
|
+
*/
|
|
165
|
+
export const RESUME_ADMISSION_OBSERVED: ReadonlySet<string> = new Set(['claude']);
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Inputs to the reuse verdict. Production passes none: `host_resume` comes
|
|
169
|
+
* from the host row, and no worker register is recorded yet, which the verdict
|
|
170
|
+
* names as `worker_register_unrecorded` rather than reading as empty.
|
|
171
|
+
*/
|
|
172
|
+
export interface ShadowDeps {
|
|
173
|
+
host_resume?: boolean;
|
|
174
|
+
workers?: readonly WorkerState[] | null;
|
|
175
|
+
context?: ReuseContext | null;
|
|
176
|
+
}
|
|
177
|
+
|
|
70
178
|
/** One candidate guard configuration under shadow evaluation. */
|
|
71
179
|
export interface Candidate {
|
|
72
180
|
readonly label: string;
|
|
@@ -136,12 +244,46 @@ function extractToolName(payload: JsonObject): string | null {
|
|
|
136
244
|
return typeof v === 'string' && v ? v : null;
|
|
137
245
|
}
|
|
138
246
|
|
|
139
|
-
export function processEnvelope(envelope: JsonValue, consumerRoot: string): number {
|
|
247
|
+
export function processEnvelope(envelope: JsonValue, consumerRoot: string, deps: ShadowDeps = {}): number {
|
|
140
248
|
try {
|
|
141
249
|
if (!isObject(envelope)) return EXIT_ALLOW;
|
|
142
250
|
const payload = unwrapPayload(envelope);
|
|
143
251
|
const toolName = extractToolName(payload);
|
|
144
|
-
if (toolName === null
|
|
252
|
+
if (toolName === null) return EXIT_ALLOW;
|
|
253
|
+
if (envelope['event'] === 'post_tool_use' || payload['hook_event_name'] === 'PostToolUse') {
|
|
254
|
+
if (DISPATCH_TOOL_NAMES.has(toolName)) {
|
|
255
|
+
const sid = payload['session_id'] ?? envelope['session_id'];
|
|
256
|
+
recordNamedSpawn(consumerRoot, payload, typeof sid === 'string' ? sid : null, new Date().toISOString());
|
|
257
|
+
}
|
|
258
|
+
return EXIT_ALLOW;
|
|
259
|
+
}
|
|
260
|
+
const isResume = RESUME_TOOL_NAMES.has(toolName);
|
|
261
|
+
if (!isResume && !DISPATCH_TOOL_NAMES.has(toolName)) return EXIT_ALLOW;
|
|
262
|
+
const platform = typeof envelope['platform'] === 'string' ? envelope['platform'] : null;
|
|
263
|
+
const toolInput = isObject(payload['tool_input']) ? payload['tool_input'] : {};
|
|
264
|
+
const sessionRaw = payload['session_id'] ?? envelope['session_id'];
|
|
265
|
+
const sessionId = typeof sessionRaw === 'string' ? sessionRaw : null;
|
|
266
|
+
const sendKind: SendKind | null = isResume ? classifySend(consumerRoot, toolInput, sessionId) : null;
|
|
267
|
+
// A spawn's definition and requested name (as its session digest), so a
|
|
268
|
+
// report can join the request to the named worker a reuse would address.
|
|
269
|
+
const reqName = toolInput['name'];
|
|
270
|
+
const spawnFacts = isResume
|
|
271
|
+
? {}
|
|
272
|
+
: {
|
|
273
|
+
...stateStamp(payload['cwd']),
|
|
274
|
+
agent_type: typeof toolInput['subagent_type'] === 'string' ? toolInput['subagent_type'] : null,
|
|
275
|
+
...(typeof reqName === 'string' && reqName && reqName.length <= NAME_MAX && sessionId
|
|
276
|
+
? { name_key: nameKey(sessionId, reqName) }
|
|
277
|
+
: {}),
|
|
278
|
+
};
|
|
279
|
+
// Only the verdict's label and reason codes reach disk — never the tool input.
|
|
280
|
+
const reuse = isResume
|
|
281
|
+
? null
|
|
282
|
+
: shadowReuseVerdict({
|
|
283
|
+
host_resume: deps.host_resume ?? probeHostCapabilities(platform).worker_resume,
|
|
284
|
+
workers: deps.workers ?? null,
|
|
285
|
+
context: deps.context ?? null,
|
|
286
|
+
});
|
|
145
287
|
|
|
146
288
|
const stats = openRecordStats(consumerRoot);
|
|
147
289
|
// Pre-spawn there is no agent id to resolve a parent from; the deepest
|
|
@@ -167,7 +309,17 @@ export function processEnvelope(envelope: JsonValue, consumerRoot: string): numb
|
|
|
167
309
|
// one the ledger already fixed for itself.
|
|
168
310
|
ledger_present: stats.ledger_present,
|
|
169
311
|
stale_open_excluded: stats.stale_excluded,
|
|
170
|
-
|
|
312
|
+
// A message to a running worker starts no run, so it is not set
|
|
313
|
+
// against a threshold that counts runs.
|
|
314
|
+
...(sendKind === 'message_running'
|
|
315
|
+
? {}
|
|
316
|
+
: { candidates: verdicts.map((v) => ({ label: v.label, would_deny: v.would_deny, on: v.on })) }),
|
|
317
|
+
dispatch_kind: sendKind ?? 'spawn',
|
|
318
|
+
...spawnFacts,
|
|
319
|
+
resume_admission: platform !== null && RESUME_ADMISSION_OBSERVED.has(platform) ? 'counted' : 'unobserved',
|
|
320
|
+
...(reuse === null ? {} : { reuse }),
|
|
321
|
+
// A recent host-sourced rate marker: a new spawn would have waited.
|
|
322
|
+
...(isResume ? {} : { rate_window: recentHostMarker(consumerRoot) ? 'would_wait' : 'clear' }),
|
|
171
323
|
// Shadow posture is a property of this file, not of a setting —
|
|
172
324
|
// there is no code path here that can deny.
|
|
173
325
|
posture: 'shadow',
|
|
@@ -280,7 +280,7 @@ export function atomic_write_text(target: string, text: string): void {
|
|
|
280
280
|
*
|
|
281
281
|
* PLATFORM AND VERSION the guarantee is claimed on: **local filesystems on the
|
|
282
282
|
* platforms this package supports** — macOS/APFS and Linux/ext4|btrfs|xfs, on
|
|
283
|
-
* Node >=
|
|
283
|
+
* Node >= 22.6.0 (`package.json` `engines`). Native Windows is explicitly not
|
|
284
284
|
* a first-class target (`docs/installation.md` § Windows names WSL2 or Git
|
|
285
285
|
* Bash), so no claim is made for it. Verified locally on Darwin 24.6.0 arm64.
|
|
286
286
|
*
|
|
@@ -708,7 +708,7 @@ export function session_state_file(dir: string, session_id: string): string {
|
|
|
708
708
|
* FILESYSTEMS WITHOUT HARD LINKS fall back to the racy sequence, deliberately.
|
|
709
709
|
* The peer-review round asked for this before accepting `link` as the fix, and
|
|
710
710
|
* it was the one condition of the three not already met: `linkSync` is the
|
|
711
|
-
* tree's first, `engines` only pins Node >=
|
|
711
|
+
* tree's first, `engines` only pins Node >= 22.6, and `installation.md` names
|
|
712
712
|
* Windows — so a share, a FUSE mount, or a restricted container can answer
|
|
713
713
|
* `EPERM` / `ENOSYS` / `EXDEV` / `EOPNOTSUPP` / `EMLINK`. Throwing there would
|
|
714
714
|
* be caught by the pruner's outer handler and leave the tombstone behind, which
|
|
@@ -107,6 +107,7 @@
|
|
|
107
107
|
* undercount landed precisely in parallel fan-out, the mode this instrument
|
|
108
108
|
* exists to measure.
|
|
109
109
|
*/
|
|
110
|
+
import { execFileSync } from 'node:child_process';
|
|
110
111
|
import * as crypto from 'node:crypto';
|
|
111
112
|
import * as fs from 'node:fs';
|
|
112
113
|
import * as path from 'node:path';
|
|
@@ -500,6 +501,78 @@ export function appendLedgerLine(root: string, ts: string, line: Record<string,
|
|
|
500
501
|
fs.appendFileSync(file, `${JSON.stringify(line)}\n`, 'utf8');
|
|
501
502
|
}
|
|
502
503
|
|
|
504
|
+
/**
|
|
505
|
+
* The register's index: one file per key under `index/<YYYY-MM>/`, so a reader
|
|
506
|
+
* answers "did this session stop that leg" or "which ref does this name
|
|
507
|
+
* address" with one stat or read instead of scanning a ledger tail that heavy
|
|
508
|
+
* traffic can push the answer out of. Keys are digests only (`refFor` over a
|
|
509
|
+
* domain-separated string), so no session id, agent id or name is a file name.
|
|
510
|
+
*/
|
|
511
|
+
const INDEX_SUBDIR = 'index';
|
|
512
|
+
|
|
513
|
+
export function writeIndexEntry(root: string, ts: string, key: string, value: string): void {
|
|
514
|
+
if (is_replay_mode()) return;
|
|
515
|
+
const dir = path.join(root, LEDGER_DIR, INDEX_SUBDIR, ts.slice(0, 7));
|
|
516
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
517
|
+
const tmp = path.join(dir, `.${key}.${process.pid}.tmp`);
|
|
518
|
+
try {
|
|
519
|
+
fs.writeFileSync(tmp, value, 'utf8');
|
|
520
|
+
fs.renameSync(tmp, path.join(dir, key));
|
|
521
|
+
} finally {
|
|
522
|
+
fs.rmSync(tmp, { force: true });
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/** The entry for `key` in this month or the previous one; null when neither holds it. */
|
|
527
|
+
export function readIndexEntry(root: string, key: string, now: Date): string | null {
|
|
528
|
+
const prev = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() - 1, 1));
|
|
529
|
+
for (const month of [now.toISOString().slice(0, 7), prev.toISOString().slice(0, 7)]) {
|
|
530
|
+
try {
|
|
531
|
+
return fs.readFileSync(path.join(root, LEDGER_DIR, INDEX_SUBDIR, month, key), 'utf8');
|
|
532
|
+
} catch {
|
|
533
|
+
// Not in this month.
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return null;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/** The commit the checkout containing `dir` is on; null outside a repository or on any failure. */
|
|
540
|
+
export function headOf(dir: string): string | null {
|
|
541
|
+
try {
|
|
542
|
+
// An inherited GIT_DIR / GIT_WORK_TREE would override `-C`.
|
|
543
|
+
const env = Object.fromEntries(Object.entries(process.env).filter(([k]) => !k.startsWith('GIT_')));
|
|
544
|
+
return execFileSync('git', ['-C', dir, 'rev-parse', 'HEAD'], { encoding: 'utf8', timeout: 2000, stdio: ['ignore', 'pipe', 'ignore'], env }).trim() || null;
|
|
545
|
+
} catch {
|
|
546
|
+
return null;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* What a reuse decision compares between a worker's stop and a later spawn,
|
|
552
|
+
* stamped at both so a report can reconstruct it after the fact: the commit,
|
|
553
|
+
* a digest of the directory, and the install epoch (the running bundle's
|
|
554
|
+
* mtime, which changes whenever the package is rebuilt or reinstalled).
|
|
555
|
+
*/
|
|
556
|
+
export function stateStamp(cwd: unknown): { head: string | null; cwd_key: string | null; epoch: number | null } {
|
|
557
|
+
let epoch: number | null = null;
|
|
558
|
+
try {
|
|
559
|
+
epoch = fs.statSync(fileURLToPath(import.meta.url)).mtimeMs;
|
|
560
|
+
} catch {
|
|
561
|
+
// No file behind the module; the epoch stays unknown.
|
|
562
|
+
}
|
|
563
|
+
return typeof cwd === 'string' && cwd
|
|
564
|
+
? { head: headOf(cwd), cwd_key: refFor(cwd), epoch }
|
|
565
|
+
: { head: null, cwd_key: null, epoch };
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export function stopIndexKey(sessionId: string, ref: string): string {
|
|
569
|
+
return refFor(`subagent-stop\0${sessionId}\0${ref}`);
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
export function recordStopIndex(root: string, ts: string, sessionId: string, ref: string): void {
|
|
573
|
+
writeIndexEntry(root, ts, stopIndexKey(sessionId, ref), '');
|
|
574
|
+
}
|
|
575
|
+
|
|
503
576
|
/**
|
|
504
577
|
* Candidate wall-clock stop-loss arms — Phase 3 Step 3, shadow only.
|
|
505
578
|
*
|
|
@@ -750,7 +823,14 @@ function handleStop(root: string, payload: JsonObject, nowIso: string, sessionId
|
|
|
750
823
|
// candidate was, this says whether it was aimed at the envelope.
|
|
751
824
|
envelope_field_hits: parse.field_hits,
|
|
752
825
|
concurrent_open: countOpen(root),
|
|
826
|
+
...stateStamp(payload['cwd']),
|
|
753
827
|
});
|
|
828
|
+
// After the line, and on its own: a failed index write must not cost the stop record.
|
|
829
|
+
try {
|
|
830
|
+
if (sessionId !== null) recordStopIndex(root, nowIso, sessionId, ref);
|
|
831
|
+
} catch {
|
|
832
|
+
// The guard then reads this stop as unplaced, the safe reading.
|
|
833
|
+
}
|
|
754
834
|
}
|
|
755
835
|
|
|
756
836
|
/** Process an ALREADY-PARSED dispatcher envelope. Always returns EXIT_ALLOW. */
|
|
@@ -54,6 +54,15 @@
|
|
|
54
54
|
* paragraph promised more than the code did (finding 2 of this
|
|
55
55
|
* change's own completion review), and a gate whose documented
|
|
56
56
|
* assurance outruns its implementation is quoted as written.
|
|
57
|
+
*
|
|
58
|
+
* SUPERSEDED WHERE A RECORD EXISTS. On a host whose `post_tool_use`
|
|
59
|
+
* recorder is live, the transcript reading above is not consulted at all: a manifest counts
|
|
60
|
+
* only when its current bytes hash to the digest the hook recorded as
|
|
61
|
+
* a standalone render of that file finished (`_lib/asset_render_record.ts`).
|
|
62
|
+
* No write-route pattern list stands in for that observation, so a
|
|
63
|
+
* manifest written by ANY other route discharges nothing. The paragraph
|
|
64
|
+
* above remains the rule only where no record exists, and the refusal
|
|
65
|
+
* says so.
|
|
57
66
|
* (iv) A deleted `.svg` opens no obligation — it has no current digest, so
|
|
58
67
|
* there is nothing a render could be bound to.
|
|
59
68
|
*
|
|
@@ -74,6 +83,14 @@ import * as fs from 'node:fs';
|
|
|
74
83
|
import * as path from 'node:path';
|
|
75
84
|
|
|
76
85
|
import { isAssetRenderCommand } from '../_lib/verification_command.js';
|
|
86
|
+
import {
|
|
87
|
+
RENDER_REL,
|
|
88
|
+
hasInstrumentGap,
|
|
89
|
+
isPureRender,
|
|
90
|
+
readAssetRenderRecords,
|
|
91
|
+
recordedManifest,
|
|
92
|
+
type AssetRenderRecord,
|
|
93
|
+
} from '../_lib/asset_render_record.js';
|
|
77
94
|
import type { ToolCall } from '../_lib/turn_end_transcript.js';
|
|
78
95
|
|
|
79
96
|
/**
|
|
@@ -83,7 +100,7 @@ import type { ToolCall } from '../_lib/turn_end_transcript.js';
|
|
|
83
100
|
* Two copies of a command-shape regex is how the two detectors come to
|
|
84
101
|
* disagree about what a render is.
|
|
85
102
|
*/
|
|
86
|
-
export { isAssetRenderCommand };
|
|
103
|
+
export { isAssetRenderCommand, isPureRender, RENDER_REL };
|
|
87
104
|
|
|
88
105
|
/**
|
|
89
106
|
* Tools that WRITE. One copy, here rather than imported from the gate: the
|
|
@@ -91,9 +108,6 @@ export { isAssetRenderCommand };
|
|
|
91
108
|
*/
|
|
92
109
|
const EDIT_TOOLS = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit']);
|
|
93
110
|
|
|
94
|
-
/** Where `ui:render` writes. One copy of the path, shared with the CLI by value. */
|
|
95
|
-
export const RENDER_REL = path.join('agents', 'runtime', 'state', 'render');
|
|
96
|
-
|
|
97
111
|
/**
|
|
98
112
|
* Paths whose `.svg` files are planted on purpose. Precision (ii).
|
|
99
113
|
*
|
|
@@ -255,6 +269,44 @@ export interface SvgObligationInputs {
|
|
|
255
269
|
* none of them discharges anything (16.5.0 release review).
|
|
256
270
|
*/
|
|
257
271
|
renderDirTampered?: boolean;
|
|
272
|
+
/**
|
|
273
|
+
* The renders the `post_tool_use` recorder saw finish this turn, or
|
|
274
|
+
* `null` where no recorder is live. An array — even an empty one — is the
|
|
275
|
+
* ONLY evidence read: the transcript fields above are then ignored.
|
|
276
|
+
*/
|
|
277
|
+
recorded?: readonly AssetRenderRecord[] | null;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** Appended to every refusal on a host with no live recorder. Pinned verbatim. */
|
|
281
|
+
export const TRANSCRIPT_FALLBACK_REASON =
|
|
282
|
+
'transcript fallback: no readable `post_tool_use` render record exists for this turn — no live ' +
|
|
283
|
+
'recorder on this host (`agent-config hooks:status`), or a render whose exit status the host did not ' +
|
|
284
|
+
'report — so the manifest was read under the transcript rule — ' +
|
|
285
|
+
'an omission check, not an attestation';
|
|
286
|
+
|
|
287
|
+
/** The record-path verdict for one file. */
|
|
288
|
+
function recordVerdict(
|
|
289
|
+
root: string,
|
|
290
|
+
abs: string,
|
|
291
|
+
digest: string,
|
|
292
|
+
records: readonly AssetRenderRecord[],
|
|
293
|
+
): DischargeKind | string {
|
|
294
|
+
let changed = false;
|
|
295
|
+
for (const r of records) {
|
|
296
|
+
if (path.resolve(root, r.file) !== abs || r.file_digest !== digest) continue;
|
|
297
|
+
const read = recordedManifest(root, r);
|
|
298
|
+
if (read === null) continue;
|
|
299
|
+
if ('changed' in read) {
|
|
300
|
+
changed = true;
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
const kind = dischargeFor([read.manifest as AssetManifestish], digest);
|
|
304
|
+
if (kind !== null) return kind;
|
|
305
|
+
}
|
|
306
|
+
return changed
|
|
307
|
+
? 'the manifest the observed render left has changed since, so it is no longer the record of that render'
|
|
308
|
+
: 'no successful `ui:render --profile asset` of these bytes was observed by the hook this turn with a ' +
|
|
309
|
+
'manifest that discharges them — a manifest written by any other route discharges nothing';
|
|
258
310
|
}
|
|
259
311
|
|
|
260
312
|
/**
|
|
@@ -294,6 +346,13 @@ export function readSvgObligations(root: string, inputs: SvgObligationInputs): S
|
|
|
294
346
|
}
|
|
295
347
|
const digest = crypto.createHash('sha256').update(bytes).digest('hex');
|
|
296
348
|
|
|
349
|
+
if (Array.isArray(inputs.recorded)) {
|
|
350
|
+
const verdict = recordVerdict(root, path.resolve(root, abs), digest, inputs.recorded);
|
|
351
|
+
if (verdict === 'verified' || verdict === 'static-only') discharged.push({ file: relPath, kind: verdict });
|
|
352
|
+
else open.push({ file: relPath, reason: verdict });
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
|
|
297
356
|
// (iii) The manifests are only consulted once a render was observed.
|
|
298
357
|
// Reading them first and then discarding the verdict would make the
|
|
299
358
|
// ordering look like a performance detail rather than the rule.
|
|
@@ -365,19 +424,6 @@ export function renderNames(commands: readonly string[], relPath: string): boole
|
|
|
365
424
|
});
|
|
366
425
|
}
|
|
367
426
|
|
|
368
|
-
/**
|
|
369
|
-
* A render call standing alone — no second command chained to it and no
|
|
370
|
-
* redirect — so its text cannot also carry a write. A leading `cd <dir> &&`,
|
|
371
|
-
* piping its output to a read-only filter, and folding stderr into stdout are
|
|
372
|
-
* allowed.
|
|
373
|
-
*/
|
|
374
|
-
export function isPureRender(command: string): boolean {
|
|
375
|
-
if (!isAssetRenderCommand(command)) return false;
|
|
376
|
-
const [head, ...pipes] = command.replace(/^\s*cd\s+[^;&|<>`$\n]+&&\s*/, '').replace(/\s\d?>&\d\b/g, ' ').replace(/\s2>\s*\/dev\/null\b/g, ' ').split('|');
|
|
377
|
-
if (/[;&<>`\n]|\$\(/.test(head ?? '')) return false;
|
|
378
|
-
return pipes.every((p) => /^\s*(tail|head|grep|jq|cat|less|wc)\b[^;&<>`|]*$/.test(p) && !/\$\(/.test(p));
|
|
379
|
-
}
|
|
380
|
-
|
|
381
427
|
/**
|
|
382
428
|
* Does a shell command (other than a pure render) write somewhere a render
|
|
383
429
|
* manifest could live? Read by shape: a write operator, together with the
|
|
@@ -430,7 +476,12 @@ function escapeRe(s: string): string {
|
|
|
430
476
|
export function openSvgObligation(
|
|
431
477
|
workspaceRoot: string,
|
|
432
478
|
toolCalls: readonly ToolCall[],
|
|
479
|
+
recordedRaw: readonly unknown[] | null = null,
|
|
433
480
|
): { detector: 'verification'; evidence: string; reason: string; mode: 'transcript' } | null {
|
|
481
|
+
// A render the host reported no exit for is an instrument gap, never a
|
|
482
|
+
// missing render: refusing on it would refuse honest work for the host's
|
|
483
|
+
// silence, so the transcript rule answers instead.
|
|
484
|
+
const recordedRenders = recordedRaw === null || hasInstrumentGap(recordedRaw) ? null : recordedRaw;
|
|
434
485
|
// Precision (iii). The render has to come AFTER the edit it describes, on
|
|
435
486
|
// both evidence paths — `toolCalls` is assembled for both, so one rule
|
|
436
487
|
// covers them rather than two that can disagree.
|
|
@@ -470,7 +521,11 @@ export function openSvgObligation(
|
|
|
470
521
|
|
|
471
522
|
let reading: SvgObligationReading;
|
|
472
523
|
try {
|
|
473
|
-
reading = readSvgObligations(workspaceRoot, {
|
|
524
|
+
reading = readSvgObligations(workspaceRoot, {
|
|
525
|
+
edits,
|
|
526
|
+
renderDirTampered,
|
|
527
|
+
recorded: recordedRenders === null ? null : readAssetRenderRecords(recordedRenders),
|
|
528
|
+
});
|
|
474
529
|
} catch {
|
|
475
530
|
// A gate that crashed on its own instrument is a new failure mode on a
|
|
476
531
|
// path meant to be inert. An unreadable render directory is no finding.
|
|
@@ -492,6 +547,7 @@ export function openSvgObligation(
|
|
|
492
547
|
reason:
|
|
493
548
|
`this turn edited an .svg and no render describes it${more} — ${first.reason}. ` +
|
|
494
549
|
'A bare `ui:render --profile asset` that rendered nothing, and a test or lint run over other ' +
|
|
495
|
-
'files, both discharge nothing: the gate reads the render, never the call.'
|
|
550
|
+
'files, both discharge nothing: the gate reads the render, never the call.' +
|
|
551
|
+
(recordedRenders === null ? ` (${TRANSCRIPT_FALLBACK_REASON})` : ''),
|
|
496
552
|
};
|
|
497
553
|
}
|
|
@@ -47,9 +47,17 @@
|
|
|
47
47
|
* identical while the cost came back. The `RESULT_KEYS` literals below are the
|
|
48
48
|
* key NAMES this concern looks under, not a read of the body.
|
|
49
49
|
*
|
|
50
|
-
* TWO COUNTS, ONE OF THEM REDUNDANT TODAY.
|
|
51
|
-
*
|
|
52
|
-
* model.
|
|
50
|
+
* TWO COUNTS, ONE OF THEM REDUNDANT TODAY. Both count the host's HOOK
|
|
51
|
+
* ENVELOPE — the serialised `tool_response` the host hands a post_tool_use
|
|
52
|
+
* hook — and NOT what reached the model. The two differ by tool: for Edit and
|
|
53
|
+
* Write the hook envelope carries the whole original file while the model
|
|
54
|
+
* receives a short confirmation, so for those two tools the envelope is many
|
|
55
|
+
* times what the model saw, and for a text Read it is about the same. The
|
|
56
|
+
* payload the model received is a separate metric,
|
|
57
|
+
* `tool-result-payload-bytes`, read from transcripts. `raw_bytes` is
|
|
58
|
+
* the hook envelope the host handed the dispatcher; `delivered_bytes` is the
|
|
59
|
+
* hook envelope after any rewrite a concern could apply on its way back.
|
|
60
|
+
* Today they are EQUAL BY CONSTRUCTION, and the construction is
|
|
53
61
|
* checkable: nothing under `src/` or `docs/` emits the host's result-rewrite
|
|
54
62
|
* field, so no concern can rewrite a tool result on its way past. That
|
|
55
63
|
* absence is a grep, and the grep lives in this concern's test rather than
|
|
@@ -196,10 +204,11 @@ function censusFile(consumerRoot: string): string {
|
|
|
196
204
|
export interface CensusLine {
|
|
197
205
|
ts: string;
|
|
198
206
|
tool: string | null;
|
|
199
|
-
/** UTF-8 bytes the host handed the dispatcher. `null` ⇒ unmeasurable. */
|
|
207
|
+
/** UTF-8 bytes of the hook envelope the host handed the dispatcher. `null` ⇒ unmeasurable. */
|
|
200
208
|
raw_bytes: number | null;
|
|
201
209
|
/**
|
|
202
|
-
* UTF-8 bytes
|
|
210
|
+
* UTF-8 bytes of the hook envelope after any rewrite — NOT what reached
|
|
211
|
+
* the model (see the header; that figure is `tool-result-payload-bytes`).
|
|
203
212
|
*
|
|
204
213
|
* Equal to {@link CensusLine.raw_bytes} by construction today — nothing in
|
|
205
214
|
* this tree rewrites a tool result. It is recorded anyway so that a later
|
|
@@ -1282,7 +1282,7 @@ function runDetectors(inputs: DetectorInputs): Finding[] {
|
|
|
1282
1282
|
// on a completion CLAIM, and a turn waiting on a subagent has not
|
|
1283
1283
|
// finished — so its closing is not the claim F is about. Same slot,
|
|
1284
1284
|
// opposite trigger, opposite treatment of `dispatchOpen`.
|
|
1285
|
-
openSvgObligation(workspaceRoot, toolCalls),
|
|
1285
|
+
openSvgObligation(workspaceRoot, toolCalls, runState?.asset_renders ?? null),
|
|
1286
1286
|
dispatchOpen ? null : detectUntestedChange(lastAssistant, toolCalls, runState),
|
|
1287
1287
|
]) {
|
|
1288
1288
|
if (f) findings.push(f);
|
|
@@ -46,7 +46,7 @@ import * as path from 'node:path';
|
|
|
46
46
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
47
47
|
|
|
48
48
|
import { hookSectionEnabled } from '../_lib/hook_settings.js';
|
|
49
|
-
import { isUiPath, isUiTreePath } from '../_lib/ui_surface.js';
|
|
49
|
+
import { isHandoverShape, isUiPath, isUiTreePath } from '../_lib/ui_surface.js';
|
|
50
50
|
import { readHookStdin } from './hook_stdin.js';
|
|
51
51
|
import { EXIT_ALLOW, EXIT_WARN } from './exit_codes.js';
|
|
52
52
|
|
|
@@ -164,17 +164,7 @@ export function isUiWrite(event: ToolEvent): boolean {
|
|
|
164
164
|
* read-before-write, and `report_consultation_rate`'s output says so.
|
|
165
165
|
*/
|
|
166
166
|
export function isArtifactRead(event: ToolEvent): boolean {
|
|
167
|
-
|
|
168
|
-
const normalized = event.file.replace(/\\/g, '/').toLowerCase();
|
|
169
|
-
return (
|
|
170
|
-
normalized.endsWith('design.html') ||
|
|
171
|
-
// The Claude Design canvas artboard. NOT covered by the line above:
|
|
172
|
-
// `ToDo.dc.html` does not end in `design.html`, which is exactly why
|
|
173
|
-
// the rule needed a second file pattern (2.5) and why the drift guard
|
|
174
|
-
// below reds when one is added here without the other.
|
|
175
|
-
normalized.endsWith('.dc.html') ||
|
|
176
|
-
normalized.includes('.claude/design-system/')
|
|
177
|
-
);
|
|
167
|
+
return !event.isWrite && isHandoverShape(event.file);
|
|
178
168
|
}
|
|
179
169
|
|
|
180
170
|
export interface SessionState {
|
|
@@ -46,6 +46,17 @@ import {
|
|
|
46
46
|
type RefusalStats,
|
|
47
47
|
} from "./_lib/turn_end_refusals.js";
|
|
48
48
|
import { ledgerWritable, readDelivered } from "./_lib/obligations.js";
|
|
49
|
+
import {
|
|
50
|
+
defaultFloorPostureDeps,
|
|
51
|
+
readFloorPosture,
|
|
52
|
+
renderFloorPosture,
|
|
53
|
+
type FloorPosture,
|
|
54
|
+
} from "./_lib/floor_posture.js";
|
|
55
|
+
import {
|
|
56
|
+
readCredentialDenyTier,
|
|
57
|
+
renderCredentialDenyTier,
|
|
58
|
+
type CredentialDenyReport,
|
|
59
|
+
} from "./_lib/credential_deny_rows.js";
|
|
49
60
|
|
|
50
61
|
// src/scripts/hooks_doctor.ts → parents[2] (../../..) is the repo root,
|
|
51
62
|
// mirroring the Python `Path(__file__).resolve().parents[2]`.
|
|
@@ -205,6 +216,18 @@ export interface DoctorPayload {
|
|
|
205
216
|
obligation_ledger: ObligationLedgerStats;
|
|
206
217
|
/** The machine's install stamp, for reading the version split below it. */
|
|
207
218
|
install_boundary: InstallBoundary;
|
|
219
|
+
/**
|
|
220
|
+
* What carries the destructive-action floor here: whether the hook runtime
|
|
221
|
+
* resolves at all, the host sandbox keys, and any neighbour PreToolUse hook.
|
|
222
|
+
* Report only — it never changes the exit code and never writes a setting.
|
|
223
|
+
*/
|
|
224
|
+
floor_posture: FloorPosture;
|
|
225
|
+
/**
|
|
226
|
+
* The host's own deny rows for the credential classes the read guard refuses:
|
|
227
|
+
* which are in force, and which the user would paste. Offered, never written:
|
|
228
|
+
* a written row would break the published no-host-setting-write commitment.
|
|
229
|
+
*/
|
|
230
|
+
credential_deny: CredentialDenyReport;
|
|
208
231
|
}
|
|
209
232
|
|
|
210
233
|
/** What the doctor can say about the ledger without interpreting a single row. */
|
|
@@ -316,6 +339,8 @@ export function collect(
|
|
|
316
339
|
turn_end_refusals,
|
|
317
340
|
obligation_ledger: collectLedgerStats(project_root),
|
|
318
341
|
install_boundary: readInstallBoundary(),
|
|
342
|
+
floor_posture: readFloorPosture(defaultFloorPostureDeps(project_root)),
|
|
343
|
+
credential_deny: readCredentialDenyTier(defaultFloorPostureDeps(project_root)),
|
|
319
344
|
};
|
|
320
345
|
}
|
|
321
346
|
|
|
@@ -500,6 +525,12 @@ export function _render_table(payload: DoctorPayload): string {
|
|
|
500
525
|
lines.push(..._render_refusals(payload));
|
|
501
526
|
lines.push("");
|
|
502
527
|
lines.push(..._render_ledger(payload));
|
|
528
|
+
lines.push("");
|
|
529
|
+
lines.push("Floor posture");
|
|
530
|
+
lines.push("-".repeat(60));
|
|
531
|
+
lines.push(...renderFloorPosture(payload.floor_posture));
|
|
532
|
+
lines.push("");
|
|
533
|
+
lines.push(...renderCredentialDenyTier(payload.credential_deny));
|
|
503
534
|
// Dispatch-issues detail — last 20 grouped by concern.
|
|
504
535
|
if (payload.dispatch_issues.length > 0) {
|
|
505
536
|
lines.push("");
|