@event4u/agent-config 9.7.0 → 9.9.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +314 -190
- package/CONTRIBUTING.md +23 -7
- package/MIGRATION.md +20 -0
- package/README.md +57 -11
- package/dist/agent-src/commands/agents/audit.md +1 -1
- package/dist/agent-src/commands/agents/optimize.md +2 -2
- package/dist/agent-src/commands/agents/user.md +1 -1
- package/dist/agent-src/commands/agents.md +1 -1
- package/dist/agent-src/commands/check-current-md.md +3 -3
- package/dist/agent-src/commands/commit/in-chunks.md +8 -0
- package/dist/agent-src/commands/commit.md +17 -0
- package/dist/agent-src/commands/fix/portability.md +2 -2
- package/dist/agent-src/commands/fix/pr-comments-loop.md +136 -0
- package/dist/agent-src/commands/fix/refs.md +2 -2
- package/dist/agent-src/commands/fix/route.md +4 -3
- package/dist/agent-src/commands/fix.md +9 -6
- package/dist/agent-src/commands/ghostwriter.md +1 -1
- package/dist/agent-src/commands/image.md +1 -1
- package/dist/agent-src/commands/optimize/augmentignore.md +1 -1
- package/dist/agent-src/commands/optimize/skills.md +2 -2
- package/dist/agent-src/commands/post-as.md +1 -1
- package/dist/agent-src/commands/pr/create.md +4 -0
- package/dist/agent-src/commands/research.md +1 -1
- package/dist/agent-src/commands/roadmap/ai-council.md +1 -1
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/team/delegate.md +4 -0
- package/dist/agent-src/commands/video.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +1 -1
- package/dist/agent-src/contexts/contracts/emergency-triage-block.md +2 -2
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +48 -2
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +10 -0
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +109 -8
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +20 -0
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +53 -3
- package/dist/agent-src/contexts/override-system.md +75 -5
- package/dist/agent-src/rules/code-provenance.md +112 -0
- package/dist/agent-src/rules/context-hygiene.md +2 -0
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +97 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +13 -3
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
- package/dist/agent-src/rules/git-history-discipline.md +2 -0
- package/dist/agent-src/rules/history-discipline.md +80 -0
- package/dist/agent-src/rules/language-and-tone.md +2 -0
- package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -0
- package/dist/agent-src/rules/media-governance-routing.md +2 -0
- package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
- package/dist/agent-src/rules/no-roadmap-references.md +4 -1
- package/dist/agent-src/rules/non-destructive-by-default.md +20 -0
- package/dist/agent-src/rules/onboarding-gate.md +2 -0
- package/dist/agent-src/rules/output-discipline.md +2 -0
- package/dist/agent-src/rules/persona-governance.md +2 -0
- package/dist/agent-src/rules/php-coding.md +1 -0
- package/dist/agent-src/rules/preservation-guard.md +3 -0
- package/dist/agent-src/rules/reviewer-awareness.md +1 -0
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +1 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +9 -0
- package/dist/agent-src/rules/scale-discipline.md +92 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +106 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +11 -1
- package/dist/agent-src/rules/session-canary.md +77 -0
- package/dist/agent-src/rules/skill-quality.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +2 -0
- package/dist/agent-src/rules/source-of-truth.md +2 -0
- package/dist/agent-src/rules/telegraph-speak.md +2 -0
- package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -1
- package/dist/agent-src/rules/tool-safety.md +4 -1
- package/dist/agent-src/rules/untrusted-input-defense.md +10 -0
- package/dist/agent-src/rules/verify-before-complete.md +2 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +17 -1
- package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
- package/dist/agent-src/skills/code-intelligence/SKILL.md +97 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +0 -3
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-review/SKILL.md +5 -6
- package/dist/agent-src/skills/design-tokens/SKILL.md +0 -1
- package/dist/agent-src/skills/gated-reach/SKILL.md +185 -0
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +72 -0
- package/dist/agent-src/skills/history-design/SKILL.md +101 -0
- package/dist/agent-src/skills/history-design/evals/triggers.json +17 -0
- package/dist/agent-src/skills/humanizer/SKILL.md +3 -3
- package/dist/agent-src/skills/image-analyser/SKILL.md +14 -12
- package/dist/agent-src/skills/image-editing/SKILL.md +2 -1
- package/dist/agent-src/skills/image-generation/SKILL.md +2 -1
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
- package/dist/agent-src/skills/license-compliance-audit/SKILL.md +161 -0
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +145 -0
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-credits/SKILL.md +97 -0
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +52 -0
- package/dist/agent-src/skills/md-language-check/SKILL.md +1 -1
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +7 -7
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/readme-writing/SKILL.md +6 -1
- package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -0
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +31 -12
- package/dist/agent-src/skills/rule-refactor/SKILL.md +3 -3
- package/dist/agent-src/skills/schema-review/SKILL.md +92 -0
- package/dist/agent-src/skills/schema-review/evals/triggers.json +17 -0
- package/dist/agent-src/skills/screenshot-hygiene/SKILL.md +171 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +43 -1
- package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
- package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -3
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/source-discovery/SKILL.md +5 -5
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +45 -85
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +5 -4
- package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge-two-stage.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-competitively.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-parallel.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-worktrees.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/judge-with-debate.md +29 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +2 -3
- package/dist/agent-src/skills/token-optimizer/SKILL.md +4 -4
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +4 -0
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +2 -3
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/.gitattributes.fragment +25 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/command.md +3 -3
- package/dist/agent-src/templates/github-workflows/secret-scan.yml +65 -0
- package/dist/agent-src/templates/persona.md +2 -2
- package/dist/agent-src/templates/rule.md +2 -2
- package/dist/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
- package/dist/agent-src/templates/scripts/telemetry_record.ts +33 -1
- package/dist/cli/commands/doctorShell.js +20 -0
- package/dist/cli/commands/doctorShell.js.map +1 -1
- package/dist/cli/commands/rtkDetect.js +58 -0
- package/dist/cli/commands/rtkDetect.js.map +1 -0
- package/dist/cli/configRoot.js +112 -0
- package/dist/cli/configRoot.js.map +1 -0
- package/dist/cli/configRoot.test.js +97 -0
- package/dist/cli/configRoot.test.js.map +1 -0
- package/dist/cli/firstRunNotice.js +70 -0
- package/dist/cli/firstRunNotice.js.map +1 -0
- package/dist/cli/help.js +4 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +54 -5
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +8 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +502 -101
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +6 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +95 -8
- package/dist/discovery/trust-report.md +11 -11
- package/dist/discovery/workspaces.json +36 -7
- package/dist/hooks/dispatch.js +19475 -0
- package/dist/install/agentSwitchDetection.js +75 -0
- package/dist/install/agentSwitchDetection.js.map +1 -0
- package/dist/install/agentSwitchProfile.js +117 -0
- package/dist/install/agentSwitchProfile.js.map +1 -0
- package/dist/install/atomic.js +1 -1
- package/dist/install/detect.js +1 -1
- package/dist/install/install.mjs +791 -486
- package/dist/install/rtkDetection.js +213 -0
- package/dist/install/rtkDetection.js.map +1 -0
- package/dist/install/rule_scope.js +2 -1
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/types.js +2 -2
- package/dist/install/wizard-plan.js +1 -1
- package/dist/install/wizardDismissals.js +58 -0
- package/dist/install/wizardDismissals.js.map +1 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +15 -4
- package/dist/mcp/server.json +20 -0
- package/dist/mcp/server.mjs +44292 -0
- package/dist/router.json +1 -1
- package/dist/scripts/condense.js +14 -7
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/app.js +12 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/io/sharedWriteCheck.js +101 -0
- package/dist/server/io/sharedWriteCheck.js.map +1 -0
- package/dist/server/routes/ping.js +32 -0
- package/dist/server/routes/ping.js.map +1 -1
- package/dist/server/routes/settings.js +21 -4
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/userMd.js +21 -4
- package/dist/server/routes/userMd.js.map +1 -1
- package/dist/server/routes/wizard.js +68 -25
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/schemas/settings.js +12 -2
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/server/serverInfo.js +6 -2
- package/dist/server/serverInfo.js.map +1 -1
- package/dist/server/token.js +11 -4
- package/dist/server/token.js.map +1 -1
- package/dist/server/writeRoot.js +15 -1
- package/dist/server/writeRoot.js.map +1 -1
- package/dist/shared/capabilities.js +33 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/capabilities.test.js +39 -0
- package/dist/shared/capabilities.test.js.map +1 -0
- package/dist/ui/assets/index-BpSQt5vm.js +40 -0
- package/dist/ui/assets/index-BpSQt5vm.js.map +1 -0
- package/dist/ui/assets/index-jSfMW8_t.css +1 -0
- package/dist/ui/index.html +15 -6
- package/docs/MIGRATION.md +16 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +4 -2
- package/package.json +22 -9
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
- package/src/agent-src/templates/scripts/telemetry_record.ts +33 -1
- package/src/config/agent-settings.template.yml +94 -13
- package/src/config/discovery/packs.yml +22 -0
- package/src/config/discovery/workspaces.yml +1 -1
- package/src/config/evaluator-budgets.json +47 -0
- package/src/config/hook-latency-budget.json +20 -0
- package/src/config/reach-channels.yml +217 -0
- package/src/config/reach-prescriptions-intake.yml +200 -0
- package/src/install/agentSwitchDetection.ts +90 -0
- package/src/install/agentSwitchProfile.ts +131 -0
- package/src/install/atomic.ts +1 -1
- package/src/install/detect.ts +1 -1
- package/src/install/rtkDetection.ts +274 -0
- package/src/install/rule_scope.ts +9 -2
- package/src/install/types.ts +2 -2
- package/src/install/wizard-plan.ts +1 -1
- package/src/install/wizardDismissals.ts +60 -0
- package/src/scripts/_cli/cmd_doctor.ts +62 -1
- package/src/scripts/_cli/cmd_memory_get.ts +197 -0
- package/src/scripts/_cli/cmd_refresh.ts +30 -0
- package/src/scripts/_dispatch.bash +96 -0
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +64 -1
- package/src/scripts/_lib/auto_dispatch.ts +76 -0
- package/src/scripts/_lib/detect_target_license.ts +714 -0
- package/src/scripts/_lib/exec_evidence.ts +251 -0
- package/src/scripts/_lib/fixtures/secret-detector/negatives.txt +15 -0
- package/src/scripts/_lib/fixtures/secret-detector/positives.txt +15 -0
- package/src/scripts/_lib/install_drift.ts +194 -0
- package/src/scripts/_lib/kernel_rules.ts +46 -0
- package/src/scripts/_lib/memory_fts_index.ts +390 -0
- package/src/scripts/_lib/orchestration_record.ts +91 -2
- package/src/scripts/_lib/persistence/adapter_raw_sql.ts +443 -0
- package/src/scripts/_lib/persistence/detect_audit_coverage.ts +423 -0
- package/src/scripts/_lib/persistence/detect_bounded_reads.ts +154 -0
- package/src/scripts/_lib/persistence/detect_index_parity.ts +576 -0
- package/src/scripts/_lib/persistence/detect_n1_eloquent.ts +226 -0
- package/src/scripts/_lib/persistence/detect_offload.ts +441 -0
- package/src/scripts/_lib/persistence/detect_prisma_growth.ts +74 -0
- package/src/scripts/_lib/persistence/offload_catalog.ts +73 -0
- package/src/scripts/_lib/persistence/types.ts +109 -0
- package/src/scripts/_lib/reddit_thread_parse.ts +598 -0
- package/src/scripts/_lib/risk_paths.ts +160 -0
- package/src/scripts/_lib/rtk_allowlist.ts +44 -0
- package/src/scripts/_lib/secret_detector.test.ts +108 -0
- package/src/scripts/_lib/secret_detector.ts +328 -0
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +116 -0
- package/src/scripts/_lib/spawn_env.ts +7 -0
- package/src/scripts/_lib/sqlite_guard.ts +191 -0
- package/src/scripts/_lib/subagent_spawn.ts +53 -0
- package/src/scripts/_lib/tool_probe.ts +359 -0
- package/src/scripts/_lib/worker_budget.ts +107 -0
- package/src/scripts/adr/regenerate_index.ts +81 -6
- package/src/scripts/ai_council/blind_review.ts +0 -0
- package/src/scripts/ai_council/config.ts +12 -6
- package/src/scripts/ai_council/orchestrator.ts +73 -3
- package/src/scripts/ai_team/review_gate.ts +8 -10
- package/src/scripts/ai_team/team_dispatch.ts +48 -0
- package/src/scripts/audit_adr_coverage.ts +33 -0
- package/src/scripts/audit_initial_context.ts +1 -1
- package/src/scripts/bench_cross_source_eval.ts +400 -0
- package/src/scripts/bench_honesty_score.ts +1093 -0
- package/src/scripts/bench_hook_latency.ts +218 -0
- package/src/scripts/build_mcp_catalog.ts +275 -0
- package/src/scripts/build_mcp_registry_manifest.ts +46 -0
- package/src/scripts/build_proof.ts +207 -0
- package/src/scripts/chat_history.ts +8 -5
- package/src/scripts/check_adr_frontmatter.ts +195 -0
- package/src/scripts/check_artefact_count_messaging.ts +4 -0
- package/src/scripts/check_backstop_debt.ts +210 -0
- package/src/scripts/check_bundle_path_leakage.ts +343 -0
- package/src/scripts/check_claims.ts +188 -8
- package/src/scripts/check_comparison.ts +12 -0
- package/src/scripts/check_enforcement_coverage.ts +592 -0
- package/src/scripts/check_evaluator_budgets.ts +99 -0
- package/src/scripts/check_kernel_rule_bundle.ts +16 -12
- package/src/scripts/check_knowledge_sharing.ts +12 -1
- package/src/scripts/check_no_external_sources.ts +2 -2
- package/src/scripts/check_reach_channels.ts +407 -0
- package/src/scripts/check_reach_staleness.ts +364 -0
- package/src/scripts/check_secret_leak.test.ts +47 -0
- package/src/scripts/check_secret_leak.ts +290 -0
- package/src/scripts/check_source_pointer_freshness.ts +28 -3
- package/src/scripts/code_graph/build.ts +0 -0
- package/src/scripts/code_graph/cli.ts +379 -0
- package/src/scripts/code_graph/detect.ts +186 -0
- package/src/scripts/code_graph/extract.ts +386 -0
- package/src/scripts/code_graph/intent.ts +45 -0
- package/src/scripts/code_graph/loader.ts +123 -0
- package/src/scripts/code_graph/query.ts +290 -0
- package/src/scripts/code_graph/sanitize.ts +30 -0
- package/src/scripts/code_graph/sqlite_store.ts +174 -0
- package/src/scripts/code_graph/types.ts +83 -0
- package/src/scripts/code_graph/validate.ts +63 -0
- package/src/scripts/condense.ts +14 -6
- package/src/scripts/context_hygiene_hook.ts +8 -5
- package/src/scripts/council_cli.ts +126 -12
- package/src/scripts/detect_target_license.ts +203 -0
- package/src/scripts/evaluator_umbrella.sh +145 -0
- package/src/scripts/external_sources_denylist.json +8 -4
- package/src/scripts/first_run_gate_hook.ts +9 -5
- package/src/scripts/generate_subagent_floor.ts +194 -0
- package/src/scripts/hermetic-install.sh +3 -3
- package/src/scripts/hook_manifest.yaml +65 -16
- package/src/scripts/hooks/block_kernel_rule_writes.ts +212 -0
- package/src/scripts/hooks/block_no_verify.ts +9 -9
- package/src/scripts/hooks/code_graph_nudge_hook.ts +191 -0
- package/src/scripts/hooks/concern_registry.ts +75 -0
- package/src/scripts/hooks/design_slop_hook.ts +8 -5
- package/src/scripts/hooks/dispatch_entry.ts +37 -0
- package/src/scripts/hooks/dispatch_hook.ts +176 -3
- package/src/scripts/hooks/hook_stdin.ts +42 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +26 -12
- package/src/scripts/hot_context_hook.ts +7 -6
- package/src/scripts/injection_scan_hook.ts +9 -1
- package/src/scripts/install +6 -6
- package/src/scripts/install-hooks.sh +4 -4
- package/src/scripts/install.sh +5 -4
- package/src/scripts/install.ts +264 -23
- package/src/scripts/iron_law_sha.ts +3 -12
- package/src/scripts/learning_sidecar.ts +0 -0
- package/src/scripts/lint_budget_ownership.ts +89 -0
- package/src/scripts/lint_command_routing.ts +35 -5
- package/src/scripts/lint_command_verbs.ts +42 -9
- package/src/scripts/lint_consumer_internal_refs.ts +211 -0
- package/src/scripts/lint_discovery_vocabulary.ts +2 -0
- package/src/scripts/lint_documented_commands.ts +670 -0
- package/src/scripts/lint_framework_leakage.ts +17 -3
- package/src/scripts/lint_framework_leakage_allowlist.json +32 -0
- package/src/scripts/lint_governed_writes.ts +335 -0
- package/src/scripts/lint_hidden_unicode.ts +6 -0
- package/src/scripts/lint_mcp_registry_manifest.ts +26 -1
- package/src/scripts/lint_memory_tripwire.ts +186 -0
- package/src/scripts/lint_override_kernel_guard.ts +267 -0
- package/src/scripts/lint_persistence.ts +171 -0
- package/src/scripts/lint_pre_migration_refs.ts +106 -0
- package/src/scripts/lint_provenance.ts +547 -0
- package/src/scripts/lint_provenance_vocabulary.ts +437 -0
- package/src/scripts/lint_spawn_payload.ts +283 -0
- package/src/scripts/lint_store_boundary.ts +152 -0
- package/src/scripts/lint_versioned_cache.ts +7 -1
- package/src/scripts/mcp_server/__main__.ts +7 -2
- package/src/scripts/mcp_server/catalog.ts +23 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +563 -193
- package/src/scripts/mcp_server/prompts.ts +6 -0
- package/src/scripts/mcp_server/tool_catalog_source.ts +332 -0
- package/src/scripts/mcp_server/tools.ts +56 -5
- package/src/scripts/mcp_telemetry_query.ts +2 -33
- package/src/scripts/mcp_telemetry_store.ts +64 -34
- package/src/scripts/measure_rule_budget.ts +3 -12
- package/src/scripts/memory_learn_hook.ts +126 -0
- package/src/scripts/memory_lookup.ts +0 -0
- package/src/scripts/memory_replay_24.ts +312 -0
- package/src/scripts/memory_report.ts +16 -3
- package/src/scripts/memory_signal.ts +48 -0
- package/src/scripts/memory_status.ts +6 -0
- package/src/scripts/minimal_safe_diff_hook.ts +8 -5
- package/src/scripts/onboarding_gate_hook.ts +8 -5
- package/src/scripts/orchestration_record.ts +16 -0
- package/src/scripts/pr_url_reminder_hook.ts +8 -1
- package/src/scripts/prepack-check.mjs +17 -0
- package/src/scripts/prepack_lifecycle_check.d.mts +8 -0
- package/src/scripts/prepack_lifecycle_check.mjs +82 -0
- package/src/scripts/profile_staleness_hook.ts +8 -7
- package/src/scripts/reach_doctor.ts +1651 -0
- package/src/scripts/release.ts +24 -3
- package/src/scripts/report_install_drift.ts +109 -0
- package/src/scripts/risk_escalation_shadow.ts +160 -0
- package/src/scripts/roadmap_progress_hook.ts +8 -5
- package/src/scripts/schemas/agent-settings.schema.json +23 -0
- package/src/scripts/schemas/license-policy.schema.json +89 -0
- package/src/scripts/schemas/provenance-borrow.schema.json +46 -0
- package/src/scripts/schemas/reach-channels.schema.json +134 -0
- package/src/scripts/schemas/reach-doctor-payload.schema.json +220 -0
- package/src/scripts/schemas/rule.schema.json +20 -0
- package/src/scripts/self_review_gate.test.ts +173 -1
- package/src/scripts/self_review_gate.ts +155 -15
- package/src/scripts/session_canary_hook.ts +182 -0
- package/src/scripts/skill_linter.ts +55 -0
- package/src/scripts/smoke_quickstart.ts +2 -2
- package/src/scripts/surface_probe_hook.ts +8 -7
- package/src/scripts/sync_gitattributes.ts +310 -0
- package/src/scripts/team_review_gate_hook.ts +13 -16
- package/src/scripts/validate_reach_prescriptions.ts +751 -0
- package/src/scripts/verify_before_complete_hook.ts +8 -5
- package/src/scripts/wrapper_freshness_hook.ts +8 -7
- package/src/server/schemas/settings.ts +24 -2
- package/src/shared/capabilities.test.ts +43 -0
- package/src/shared/capabilities.ts +75 -0
- package/src/templates/minimal/agents-overrides-readme.md +20 -0
- package/dist/ui/assets/index-BPFMZWUs.css +0 -1
- package/dist/ui/assets/index-BiEZiZ31.js +0 -40
- package/dist/ui/assets/index-BiEZiZ31.js.map +0 -1
- package/docs/CLAIMS.md +0 -261
- package/docs/DISTRIBUTION_CHECKLIST.md +0 -170
- package/docs/RELEASE_STORY_TEMPLATE.md +0 -37
- package/docs/SKILL_CENSUS.md +0 -352
- package/docs/adrs/cost/0001-hard-stop-hook.md +0 -114
- package/docs/adrs/cost/README.md +0 -9
- package/docs/adrs/memory/0001-consumer-side-snapshot.md +0 -119
- package/docs/adrs/memory/README.md +0 -10
- package/docs/adrs/router/0001-three-tier-routing.md +0 -119
- package/docs/adrs/router/README.md +0 -9
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +0 -102
- package/docs/adrs/schema/README.md +0 -9
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +0 -99
- package/docs/adrs/smoke/README.md +0 -9
- package/docs/adrs/telegraph/0001-default-off-until-bench.md +0 -93
- package/docs/adrs/telegraph/README.md +0 -9
- package/docs/announcements/2026-05-non-dev-launch.md +0 -79
- package/docs/announcements/2026-07-honest-cost-sweep-launch.md +0 -84
- package/docs/anti-reskin-gate.md +0 -60
- package/docs/architecture/augment-projection.md +0 -70
- package/docs/architecture/claude-bundle.md +0 -77
- package/docs/architecture/current-onboard-baseline.md +0 -126
- package/docs/architecture/current-safety-behavior.md +0 -137
- package/docs/architecture/multi-tool-projection.md +0 -125
- package/docs/architecture/setup-vs-settings-shared-surface.md +0 -114
- package/docs/architecture/source-projection.md +0 -85
- package/docs/architecture.md +0 -390
- package/docs/archive/CHANGELOG-6.0.0-overview.md +0 -953
- package/docs/archive/CHANGELOG-7.0.0.md +0 -419
- package/docs/archive/CHANGELOG-pre-2.11.0.md +0 -141
- package/docs/archive/CHANGELOG-pre-2.15.0.md +0 -244
- package/docs/archive/CHANGELOG-pre-2.16.0.md +0 -48
- package/docs/archive/CHANGELOG-pre-2.17.0.md +0 -63
- package/docs/archive/CHANGELOG-pre-2.2.0.md +0 -2138
- package/docs/archive/CHANGELOG-pre-2.20.0.md +0 -159
- package/docs/archive/CHANGELOG-pre-2.25.0.md +0 -191
- package/docs/archive/CHANGELOG-pre-2.7.0.md +0 -185
- package/docs/archive/CHANGELOG-pre-3.0.0.md +0 -130
- package/docs/archive/CHANGELOG-pre-3.1.0.md +0 -167
- package/docs/archive/CHANGELOG-pre-3.2.0.md +0 -268
- package/docs/archive/CHANGELOG-pre-4.0.0.md +0 -80
- package/docs/archive/CHANGELOG-pre-4.5.0.md +0 -289
- package/docs/archive/CHANGELOG-pre-5.4.0.md +0 -260
- package/docs/archive/CHANGELOG-pre-5.9.0.md +0 -270
- package/docs/archive/CHANGELOG-pre-6.0.0.md +0 -473
- package/docs/archive/CHANGELOG-pre-7.0.0.md +0 -126
- package/docs/archive/CHANGELOG-pre-8.0.0.md +0 -301
- package/docs/archive/CHANGELOG-pre-8.1.0.md +0 -316
- package/docs/archive/CHANGELOG-pre-8.12.0.md +0 -304
- package/docs/archive/CHANGELOG-pre-8.9.0.md +0 -306
- package/docs/archive/CHANGELOG-pre-9.2.0.md +0 -276
- package/docs/artefact-census.md +0 -71
- package/docs/benchmark.md +0 -648
- package/docs/benchmark.pinned.yml +0 -31
- package/docs/benchmarks.md +0 -85
- package/docs/capability-matrix.md +0 -33
- package/docs/case-studies/_template.md +0 -60
- package/docs/case-studies/frontend-design-positioning.md +0 -86
- package/docs/catalog.md +0 -721
- package/docs/command-flows.md +0 -272
- package/docs/command-naming-audit.md +0 -60
- package/docs/comparison.yaml +0 -45
- package/docs/contracts/CHANGELOG-conventions.md +0 -149
- package/docs/contracts/STABILITY.md +0 -188
- package/docs/contracts/adoption-signal-floor.md +0 -127
- package/docs/contracts/adr-architectural-consensus-mechanism.md +0 -68
- package/docs/contracts/adr-chat-history-split.md +0 -140
- package/docs/contracts/adr-command-suggestion.md +0 -144
- package/docs/contracts/adr-forecast-construction-shape.md +0 -90
- package/docs/contracts/adr-gtm-context-spine.md +0 -116
- package/docs/contracts/adr-implement-ticket-runtime.md +0 -121
- package/docs/contracts/adr-install-user-type-axis.md +0 -107
- package/docs/contracts/adr-layout.md +0 -107
- package/docs/contracts/adr-level-6-productization.md +0 -145
- package/docs/contracts/adr-mcp-runtime.md +0 -128
- package/docs/contracts/adr-product-ui-track.md +0 -381
- package/docs/contracts/adr-prompt-driven-execution.md +0 -186
- package/docs/contracts/adr-settings-sync-engine.md +0 -128
- package/docs/contracts/adr-user-types-axis.md +0 -127
- package/docs/contracts/adr-wing4-context-spine.md +0 -126
- package/docs/contracts/agent-user-schema.md +0 -170
- package/docs/contracts/agents-layout.md +0 -148
- package/docs/contracts/agents-md-tech-stack.md +0 -75
- package/docs/contracts/ai-council-config.md +0 -829
- package/docs/contracts/ai-team-config.md +0 -224
- package/docs/contracts/analysis-memory-loop.md +0 -149
- package/docs/contracts/at-rest-encryption.md +0 -191
- package/docs/contracts/audit-log-v1.md +0 -150
- package/docs/contracts/auto-orchestration-v1.md +0 -70
- package/docs/contracts/benchmark-ab-contract.md +0 -106
- package/docs/contracts/benchmark-corpus-spec.md +0 -125
- package/docs/contracts/benchmark-report-schema.md +0 -113
- package/docs/contracts/branch-protection-policy.md +0 -139
- package/docs/contracts/brand-token-consumption.md +0 -74
- package/docs/contracts/capability-boundary.md +0 -69
- package/docs/contracts/capability-packs.md +0 -217
- package/docs/contracts/ci-cost-budget.md +0 -111
- package/docs/contracts/ci-green-floor.md +0 -141
- package/docs/contracts/command-category-governance.md +0 -84
- package/docs/contracts/command-clusters.md +0 -399
- package/docs/contracts/command-surface-tiers.md +0 -176
- package/docs/contracts/command-taxonomy.md +0 -137
- package/docs/contracts/condensation-default-kill-criterion.md +0 -116
- package/docs/contracts/config-presets.md +0 -144
- package/docs/contracts/conformance.md +0 -84
- package/docs/contracts/consumer-bridge.md +0 -73
- package/docs/contracts/context-paths.md +0 -101
- package/docs/contracts/context-spine.md +0 -179
- package/docs/contracts/cost-dashboard.md +0 -143
- package/docs/contracts/cost-enforcement.md +0 -134
- package/docs/contracts/cost-profile-defaults.md +0 -110
- package/docs/contracts/cost-summary-schema.md +0 -107
- package/docs/contracts/creative-pack-boundary.md +0 -63
- package/docs/contracts/cross-repo-retrieval.md +0 -64
- package/docs/contracts/cross-wing-handoff.md +0 -134
- package/docs/contracts/daily-workspace.md +0 -147
- package/docs/contracts/decision-engine-gates.md +0 -120
- package/docs/contracts/decision-trace-v1.md +0 -177
- package/docs/contracts/design-artifact-lifecycle.md +0 -93
- package/docs/contracts/design-artifact-verification.md +0 -153
- package/docs/contracts/discovery-manifest.md +0 -209
- package/docs/contracts/discovery-manifest.schema.json +0 -254
- package/docs/contracts/evidence-based-pruning.md +0 -102
- package/docs/contracts/explain-modes.md +0 -187
- package/docs/contracts/explain-trace.schema.json +0 -144
- package/docs/contracts/file-ownership-matrix.json +0 -13941
- package/docs/contracts/file-ownership-matrix.md +0 -135
- package/docs/contracts/frontmatter-contract.md +0 -140
- package/docs/contracts/ghostwriter-schema.md +0 -337
- package/docs/contracts/governance-enforcement-projection.md +0 -159
- package/docs/contracts/gui-wizard.md +0 -350
- package/docs/contracts/harness-expectations.md +0 -128
- package/docs/contracts/hook-architecture-v1.md +0 -325
- package/docs/contracts/host-agent-protocol.md +0 -110
- package/docs/contracts/implement-ticket-flow.md +0 -625
- package/docs/contracts/init-telemetry.md +0 -132
- package/docs/contracts/injected-block-authenticity-model.md +0 -66
- package/docs/contracts/install-layout.md +0 -249
- package/docs/contracts/install-scopes.md +0 -82
- package/docs/contracts/installed-tools-lockfile.md +0 -144
- package/docs/contracts/installer-agent-mode.md +0 -137
- package/docs/contracts/iron-law-overrides.txt +0 -26
- package/docs/contracts/kernel-membership.md +0 -339
- package/docs/contracts/linear-ai-rules-inclusion.md +0 -143
- package/docs/contracts/linear-ai-three-layers.md +0 -130
- package/docs/contracts/linter-structural-model.md +0 -181
- package/docs/contracts/load-context-budget-model.md +0 -259
- package/docs/contracts/load-context-schema.md +0 -220
- package/docs/contracts/local-analytics.md +0 -160
- package/docs/contracts/local-knowledge-ingestion.md +0 -96
- package/docs/contracts/local-server-api.md +0 -134
- package/docs/contracts/low-impact-corpus-format.md +0 -95
- package/docs/contracts/mcp-beta-criteria.md +0 -130
- package/docs/contracts/mcp-cloud-scope.md +0 -355
- package/docs/contracts/mcp-discovery-phase-notice.md +0 -60
- package/docs/contracts/mcp-phase-1-scope.md +0 -272
- package/docs/contracts/mcp-registry-manifest.schema.json +0 -129
- package/docs/contracts/mcp-tool-inventory.md +0 -64
- package/docs/contracts/mcp-tool-stub-envelope.md +0 -78
- package/docs/contracts/measurement-baseline.md +0 -103
- package/docs/contracts/memory-visibility-v1.md +0 -160
- package/docs/contracts/mental-models.md +0 -336
- package/docs/contracts/migrate-command.md +0 -233
- package/docs/contracts/multi-tool-projection-fidelity.md +0 -134
- package/docs/contracts/namespace.md +0 -125
- package/docs/contracts/no-runtime-boundary.md +0 -61
- package/docs/contracts/one-off-script-lifecycle.md +0 -110
- package/docs/contracts/orchestration-dsl-v1.md +0 -153
- package/docs/contracts/package-self-orientation.md +0 -163
- package/docs/contracts/pilot/agent-authority.md +0 -24
- package/docs/contracts/pilot/direct-answers.md +0 -70
- package/docs/contracts/pilot/language-and-tone.md +0 -63
- package/docs/contracts/plain-language-surface.md +0 -117
- package/docs/contracts/prelaunch-diagnostics.md +0 -151
- package/docs/contracts/profile-system.md +0 -167
- package/docs/contracts/reasoning-discipline-protocol.md +0 -83
- package/docs/contracts/release-pr-gating.md +0 -151
- package/docs/contracts/release-sizing.md +0 -107
- package/docs/contracts/release-trunk-sync.md +0 -105
- package/docs/contracts/review-lens-schema.md +0 -64
- package/docs/contracts/roadmap-complexity-standard.md +0 -138
- package/docs/contracts/role-experience.md +0 -125
- package/docs/contracts/router-blending.md +0 -71
- package/docs/contracts/rule-classification.md +0 -171
- package/docs/contracts/rule-interactions.md +0 -132
- package/docs/contracts/rule-interactions.yml +0 -260
- package/docs/contracts/rule-priority-hierarchy.md +0 -88
- package/docs/contracts/rule-router.md +0 -287
- package/docs/contracts/safety-model.md +0 -129
- package/docs/contracts/session-profile-overlay.md +0 -157
- package/docs/contracts/settings-api.md +0 -264
- package/docs/contracts/settings-gui-agent-mode.schema.json +0 -128
- package/docs/contracts/settings-sync-yaml-subset.md +0 -139
- package/docs/contracts/skill-bundled-assets.md +0 -62
- package/docs/contracts/skill-discovery.md +0 -80
- package/docs/contracts/skill-distribution-channels.md +0 -66
- package/docs/contracts/skill-domains.md +0 -144
- package/docs/contracts/skill-dry-run.md +0 -47
- package/docs/contracts/skill-family-map.yml +0 -915
- package/docs/contracts/smoke-contracts.md +0 -144
- package/docs/contracts/subagent-boundary.md +0 -59
- package/docs/contracts/surface-agent-contracts.md +0 -153
- package/docs/contracts/surface-matrix.md +0 -108
- package/docs/contracts/surface-tiers.md +0 -81
- package/docs/contracts/telegraph-telemetry.md +0 -83
- package/docs/contracts/ticket-bundle-format.md +0 -233
- package/docs/contracts/tier-3-contrib-plugin.md +0 -137
- package/docs/contracts/trust-and-safety.md +0 -144
- package/docs/contracts/ui-stack-extension.md +0 -237
- package/docs/contracts/ui-track-flow.md +0 -329
- package/docs/contracts/universal-skills.md +0 -91
- package/docs/contracts/user-type-schema.md +0 -146
- package/docs/contracts/value-dashboard-spec.md +0 -378
- package/docs/contracts/value-report-schema.md +0 -168
- package/docs/contracts/workflow-packs.md +0 -121
- package/docs/contracts/workspace-boundary.md +0 -84
- package/docs/contracts/workspace-documents.md +0 -144
- package/docs/contracts/write-engine.md +0 -182
- package/docs/cookbook.md +0 -152
- package/docs/customization.md +0 -685
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +0 -109
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +0 -135
- package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +0 -137
- package/docs/decisions/ADR-004-rule-governance-pruning.md +0 -240
- package/docs/decisions/ADR-005-subagent-worktrees.md +0 -120
- package/docs/decisions/ADR-006-skill-tools-python-pilot.md +0 -114
- package/docs/decisions/ADR-007-agent-discovery-scopes.md +0 -371
- package/docs/decisions/ADR-008-installed-tools-manifest.md +0 -160
- package/docs/decisions/ADR-009-event4u-namespace.md +0 -188
- package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +0 -168
- package/docs/decisions/ADR-011-domain-pack-readiness.md +0 -213
- package/docs/decisions/ADR-012-typescript-cli-shell.md +0 -162
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +0 -342
- package/docs/decisions/ADR-014-gui-framework-choice.md +0 -136
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +0 -146
- package/docs/decisions/ADR-016-installer-architecture.md +0 -189
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +0 -261
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +0 -159
- package/docs/decisions/ADR-019-router-json-dist-location.md +0 -124
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +0 -213
- package/docs/decisions/ADR-021-deployment-shape.md +0 -153
- package/docs/decisions/ADR-022-daily-workspace-decomposition.md +0 -140
- package/docs/decisions/ADR-023-host-agent-protocol.md +0 -129
- package/docs/decisions/ADR-024-workspace-v0-feature-floor.md +0 -126
- package/docs/decisions/ADR-025-workspace-chrome.md +0 -119
- package/docs/decisions/ADR-026-explain-mode-translation.md +0 -117
- package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +0 -129
- package/docs/decisions/ADR-028-root-layout.md +0 -147
- package/docs/decisions/ADR-029-multi-workspace-deferred.md +0 -122
- package/docs/decisions/ADR-030-claude-code-command-projection.md +0 -147
- package/docs/decisions/ADR-031-validation-severity-tiers-and-projection-roundtrip.md +0 -97
- package/docs/decisions/ADR-032-linked-projects-scope.md +0 -122
- package/docs/decisions/ADR-033-distribution-identity-npm-primary.md +0 -81
- package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +0 -63
- package/docs/decisions/ADR-035-model-capability-tiers.md +0 -104
- package/docs/decisions/ADR-036-global-install-browser-wizard-handoff.md +0 -106
- package/docs/decisions/ADR-037-cost-profile-untangle.md +0 -117
- package/docs/decisions/ADR-038-canonical-settings-path.md +0 -96
- package/docs/decisions/ADR-039-claude-skills-untracked.md +0 -139
- package/docs/decisions/ADR-040-execution-model-projection-time-filtering.md +0 -244
- package/docs/decisions/ADR-041-controlled-command-verbs.md +0 -133
- package/docs/decisions/ADR-042-runtime-resolver-decision-gate.md +0 -113
- package/docs/decisions/ADR-043-monorepo-collapse-to-src-domains.md +0 -128
- package/docs/decisions/ADR-044-command-naming-scheme-hyphenated.md +0 -250
- package/docs/decisions/ADR-045-src-source-layout-and-profiles-as-views.md +0 -111
- package/docs/decisions/ADR-046-thin-command-principle.md +0 -93
- package/docs/decisions/ADR-047-framework-neutral-stack-adaptive-commands.md +0 -94
- package/docs/decisions/ADR-048-command-justification-rule.md +0 -106
- package/docs/decisions/ADR-049-configuration-trust-boundary.md +0 -132
- package/docs/decisions/ADR-050-workspace-vs-package-root-boundary.md +0 -121
- package/docs/decisions/ADR-051-uncondensed-source-container-relocation.md +0 -114
- package/docs/decisions/ADR-052-packages-removal-and-pack-home-migration.md +0 -86
- package/docs/decisions/ADR-053-agents-namespace-dual-role-resolution.md +0 -132
- package/docs/decisions/ADR-054-rule-adherence-decay-triggered-restate.md +0 -143
- package/docs/decisions/ADR-055-flow-layer-data-model.md +0 -235
- package/docs/decisions/ADR-056-unvalidated-video-adapters-disposition.md +0 -124
- package/docs/decisions/ADR-057-consolidation-evidence-gate-outcomes.md +0 -135
- package/docs/decisions/ADR-058-condensed-output-relocation-to-dist.md +0 -94
- package/docs/decisions/ADR-059-render-resume-filesystem-as-state.md +0 -161
- package/docs/decisions/ADR-060-comfyui-sandbox-model.md +0 -154
- package/docs/decisions/ADR-061-corpus-grounding-layer.md +0 -230
- package/docs/decisions/ADR-062-encrypt-at-rest-store-architecture.md +0 -121
- package/docs/decisions/ADR-063-append-jsonl-encryption-deferred.md +0 -83
- package/docs/decisions/ADR-064-append-jsonl-per-record-encryption.md +0 -113
- package/docs/decisions/ADR-065-tier3-inbox-handoff-v0.md +0 -86
- package/docs/decisions/ADR-066-skill-body-prerendering.md +0 -93
- package/docs/decisions/ADR-067-glama-registry-listing.md +0 -259
- package/docs/decisions/ADR-068-host-tier-detection.md +0 -90
- package/docs/decisions/ADR-069-prompt-renderer.md +0 -97
- package/docs/decisions/ADR-070-tier1-drive-loop.md +0 -94
- package/docs/decisions/ADR-071-launch-drive-integration.md +0 -95
- package/docs/decisions/ADR-072-codex-gemini-drive-configs.md +0 -90
- package/docs/decisions/ADR-073-drive-health-kill-switch.md +0 -81
- package/docs/decisions/ADR-074-drive-kill-switch-auto-recovery.md +0 -84
- package/docs/decisions/ADR-075-workspace-gui-drive.md +0 -83
- package/docs/decisions/ADR-076-workspace-multi-turn.md +0 -92
- package/docs/decisions/ADR-077-workspace-followup-gui.md +0 -70
- package/docs/decisions/ADR-078-drive-health-panel.md +0 -70
- package/docs/decisions/ADR-079-workspace-host-picker.md +0 -81
- package/docs/decisions/ADR-080-host-session-expired-410.md +0 -92
- package/docs/decisions/ADR-081-drive-health-reset-and-410-affordance.md +0 -71
- package/docs/decisions/ADR-082-410-one-click-relaunch.md +0 -58
- package/docs/decisions/ADR-083-session-thread-and-arbitrary-continuation.md +0 -85
- package/docs/decisions/ADR-084-drive-health-refresh-on-drive.md +0 -52
- package/docs/decisions/ADR-085-mcp-stdio-end-user-distribution-shape.md +0 -158
- package/docs/decisions/ADR-086-read-only-cross-agent-mcp-discovery-helper.md +0 -171
- package/docs/decisions/ADR-087-installer-e2e-test-strategy.md +0 -111
- package/docs/decisions/ADR-088-no-external-runtime-federation.md +0 -144
- package/docs/decisions/ADR-089-lean-local-plugin-install.md +0 -111
- package/docs/decisions/ADR-090-visibility-command-frontmatter-field.md +0 -95
- package/docs/decisions/ADR-091-split-meta-capability-packs.md +0 -113
- package/docs/decisions/ADR-092-defer-command-tier-alias-removal.md +0 -117
- package/docs/decisions/ADR-093-ai-council-config-user-global.md +0 -117
- package/docs/decisions/ADR-094-agent-memory-layer-removal.md +0 -94
- package/docs/decisions/ADR-095-workspace-boundary-contract.md +0 -108
- package/docs/decisions/ADR-096-analysis-workbench.md +0 -110
- package/docs/decisions/ADR-097-mission-recipe-privilege-boundary.md +0 -121
- package/docs/decisions/ADR-098-evidence-first-structure-discovery.md +0 -154
- package/docs/decisions/ADR-099-file-first-pattern-library.md +0 -87
- package/docs/decisions/ADR-100-global-knowledge-card-sharing.md +0 -140
- package/docs/decisions/ADR-101-ticket-bundle-emission.md +0 -109
- package/docs/decisions/ADR-102-ticket-handoff-paste-and-mcp.md +0 -72
- package/docs/decisions/ADR-103-global-knowledge-default-off-until-measured.md +0 -92
- package/docs/decisions/ADR-104-ai-council-config-global-only.md +0 -119
- package/docs/decisions/ADR-105-automatic-subagent-orchestration.md +0 -108
- package/docs/decisions/ADR-106-recursive-verification-benchmark-gate.md +0 -126
- package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +0 -70
- package/docs/decisions/ADR-108-open-source-forever-no-commercial-tier.md +0 -46
- package/docs/decisions/ADR-109-subagent-v1-contract.md +0 -246
- package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +0 -110
- package/docs/decisions/ADR-111-canonical-glama-listing.md +0 -97
- package/docs/decisions/ADR-112-stdio-lite-stays-read-only.md +0 -92
- package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +0 -201
- package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +0 -85
- package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +0 -91
- package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +0 -144
- package/docs/decisions/ADR-117-subagents-auto-default-on.md +0 -89
- package/docs/decisions/ADR-118-loop-engineering-boundaries.md +0 -162
- package/docs/decisions/ADR-119-global-knowledge-default-on.md +0 -104
- package/docs/decisions/ADR-120-council-chairman-mode.md +0 -70
- package/docs/decisions/ADR-121-knowledge-sensitivity-classes.md +0 -90
- package/docs/decisions/ADR-122-adversarial-verification-council.md +0 -166
- package/docs/decisions/ADR-123-runtime-security-scope-and-spawn-hardening.md +0 -142
- package/docs/decisions/ADR-200-python-to-typescript-migration.md +0 -203
- package/docs/decisions/ADR-rule-kernel-and-router.md +0 -133
- package/docs/decisions/INDEX.md +0 -136
- package/docs/deploy/connector-setup.md +0 -129
- package/docs/deploy/env-vars.md +0 -70
- package/docs/deploy/policy-cookbook.md +0 -130
- package/docs/deploy/quickstart.md +0 -112
- package/docs/deploy/small-team-recipe.md +0 -148
- package/docs/deploy/team-deployment-posture.md +0 -111
- package/docs/design/adversarial-council-eval.md +0 -106
- package/docs/design/council-vs-solo-baseline.md +0 -92
- package/docs/design/cross-model-parity-eval.md +0 -82
- package/docs/design/length-neutral-judge-rerun.md +0 -92
- package/docs/design/utilization-window-criteria.md +0 -51
- package/docs/development.md +0 -230
- package/docs/distribution/awesome-list-submission.md +0 -46
- package/docs/distribution/consumer-matrix.md +0 -96
- package/docs/distribution/launch-story-draft.md +0 -58
- package/docs/distribution/mcp-submission-checklist.md +0 -95
- package/docs/distribution/public-install-smoke.md +0 -68
- package/docs/distribution/registries.md +0 -117
- package/docs/distribution/registry-submissions.md +0 -85
- package/docs/distribution/telemetry-privacy.md +0 -128
- package/docs/distribution/telemetry-schema.md +0 -174
- package/docs/distribution/topics-equivalents-decay-policy.md +0 -51
- package/docs/end-to-end-walkthroughs.md +0 -165
- package/docs/enforcement-by-host.md +0 -44
- package/docs/examples/agent-user.example.md +0 -22
- package/docs/experiences/agency.md +0 -49
- package/docs/experiences/content_creator.md +0 -49
- package/docs/experiences/developer.md +0 -49
- package/docs/experiences/finance.md +0 -50
- package/docs/experiences/founder.md +0 -49
- package/docs/experiences/ops.md +0 -49
- package/docs/featured-commands.md +0 -27
- package/docs/featured-skills.md +0 -95
- package/docs/flows.md +0 -67
- package/docs/getting-started-by-role.md +0 -190
- package/docs/getting-started-laravel.md +0 -72
- package/docs/getting-started-local-stdio.md +0 -77
- package/docs/getting-started.md +0 -254
- package/docs/github-topics.md +0 -93
- package/docs/governance-advantage.md +0 -72
- package/docs/governance.md +0 -96
- package/docs/guides/cross-repo-linked-projects.md +0 -93
- package/docs/guides/cross-repo-retrieval.md +0 -61
- package/docs/guides/frontend-design-corpus-refresh.md +0 -83
- package/docs/guides/local-analytics.md +0 -125
- package/docs/guides/local-knowledge.md +0 -127
- package/docs/guides/skill-discovery.md +0 -71
- package/docs/guides/skill-preview.md +0 -71
- package/docs/hook-payload-capture.md +0 -221
- package/docs/install-friction-report.md +0 -66
- package/docs/installation.md +0 -959
- package/docs/maintainers/branch-protection.md +0 -105
- package/docs/maintainers/dev-mode.md +0 -106
- package/docs/maintainers/optional-media-deps.md +0 -50
- package/docs/maintainers/system-map.md +0 -85
- package/docs/mcp-registries.md +0 -94
- package/docs/mcp-server.md +0 -175
- package/docs/mcp.md +0 -147
- package/docs/media/proof-demo.cast +0 -14
- package/docs/media/proof-demo.gif +0 -0
- package/docs/migration/consumer-template-consumption-model.md +0 -145
- package/docs/migration/divergences/README.md +0 -55
- package/docs/migration/divergences/_template.md +0 -50
- package/docs/migration/divergences/bench-stats-float-precision.md +0 -72
- package/docs/migration/divergences/mcp-telemetry-node-sqlite.md +0 -61
- package/docs/migration/divergences/pack-mcp-content-gzip-body.md +0 -53
- package/docs/migration/divergences/src-scripts-build_cloud_bundle.md +0 -63
- package/docs/migration/divergences/src-scripts-check_memory.md +0 -91
- package/docs/migration/divergences/src-scripts-inventory_abstraction_budget.md +0 -65
- package/docs/migration/divergences/src-scripts-lint_marketplace.md +0 -57
- package/docs/migration/divergences/src-scripts-lint_mcp_registry_manifest.md +0 -70
- package/docs/migration/divergences/src-scripts-spotcheck_thin_root.md +0 -60
- package/docs/migration/divergences/src-scripts-validate_agent_settings.md +0 -58
- package/docs/migration/node-floor.md +0 -86
- package/docs/migration/v1-to-v2.md +0 -156
- package/docs/migration/yaml-roundtrip-spike.md +0 -163
- package/docs/migrations/commands-1.15.0.md +0 -117
- package/docs/parity/bench-external.json +0 -58
- package/docs/parity/bench.json +0 -41
- package/docs/parity/command-frontmatter.md +0 -60
- package/docs/parity/external-runtime.md +0 -46
- package/docs/personas.md +0 -178
- package/docs/positioning-evidence.md +0 -86
- package/docs/profiles.md +0 -108
- package/docs/proof.md +0 -176
- package/docs/quality.md +0 -98
- package/docs/readme-split-plan.md +0 -102
- package/docs/recruits/_template.md +0 -81
- package/docs/release-runbook.md +0 -141
- package/docs/role-experiences.md +0 -19
- package/docs/safety.md +0 -30
- package/docs/second-brain-scope.md +0 -116
- package/docs/self-review-gate.md +0 -65
- package/docs/setup/enterprise-and-offline.md +0 -201
- package/docs/setup/mcp-client-config.md +0 -358
- package/docs/setup/mcp-cloud-endpoints.md +0 -116
- package/docs/setup/mcp-cloud-registry-listing.md +0 -99
- package/docs/setup/mcp-cloud-setup.md +0 -183
- package/docs/setup/mcp-r2-bootstrap.md +0 -82
- package/docs/setup/mcp-server-docker.md +0 -101
- package/docs/setup/per-ide/aider.md +0 -48
- package/docs/setup/per-ide/antigravity.md +0 -68
- package/docs/setup/per-ide/augment.md +0 -89
- package/docs/setup/per-ide/claude-code.md +0 -97
- package/docs/setup/per-ide/claude-desktop.md +0 -207
- package/docs/setup/per-ide/cline.md +0 -43
- package/docs/setup/per-ide/codebuddy.md +0 -63
- package/docs/setup/per-ide/codex.md +0 -46
- package/docs/setup/per-ide/continue.md +0 -68
- package/docs/setup/per-ide/copilot.md +0 -80
- package/docs/setup/per-ide/cursor.md +0 -125
- package/docs/setup/per-ide/droid.md +0 -65
- package/docs/setup/per-ide/gemini-cli.md +0 -45
- package/docs/setup/per-ide/jetbrains.md +0 -76
- package/docs/setup/per-ide/kilocode.md +0 -66
- package/docs/setup/per-ide/kiro.md +0 -72
- package/docs/setup/per-ide/opencode.md +0 -62
- package/docs/setup/per-ide/qoder.md +0 -63
- package/docs/setup/per-ide/roocode.md +0 -68
- package/docs/setup/per-ide/trae.md +0 -63
- package/docs/setup/per-ide/warp.md +0 -63
- package/docs/setup/per-ide/windsurf.md +0 -109
- package/docs/setup/per-ide/zed.md +0 -73
- package/docs/showcase.md +0 -209
- package/docs/skill-duplication-findings.md +0 -91
- package/docs/skills-catalog.md +0 -265
- package/docs/skills-taxonomy.md +0 -90
- package/docs/spawn-site-policy.md +0 -72
- package/docs/succession.md +0 -80
- package/docs/threat-model.md +0 -29
- package/docs/troubleshooting.md +0 -155
- package/docs/ui-track-mental-model.md +0 -121
- package/docs/us-vs-the-category.md +0 -38
- package/docs/value.md +0 -86
- package/docs/walkthroughs/assets/workspace-role-grid.png +0 -0
- package/docs/walkthroughs/assets/workspace-session-started.png +0 -0
- package/docs/walkthroughs/assets/workspace-task-picker.png +0 -0
- package/docs/walkthroughs/daily-workspace-a11y.md +0 -87
- package/docs/walkthroughs/daily-workspace.md +0 -127
- package/docs/wedge/production-validator/README.md +0 -81
- package/docs/wedge/production-validator/first-run-check.sh +0 -42
- package/docs/wedge/production-validator/production-validator.md +0 -83
- package/docs/wizard.md +0 -173
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool probe — five-state health classification for an upstream CLI backend
|
|
3
|
+
* (road-to-internet-reach Phase 2, step 1).
|
|
4
|
+
*
|
|
5
|
+
* The reach layer never wraps or proxies a tool; it only answers "is this
|
|
6
|
+
* backend usable right now, and if not, what does the human run to fix it?".
|
|
7
|
+
* This module is that answer for exactly ONE backend descriptor. Iterating a
|
|
8
|
+
* registry, rendering a table and choosing an active backend all belong to the
|
|
9
|
+
* caller (`reach_doctor.ts`), which follows the `hooks_doctor.ts` payload /
|
|
10
|
+
* exit-code conventions.
|
|
11
|
+
*
|
|
12
|
+
* Taxonomy (the whole contract):
|
|
13
|
+
*
|
|
14
|
+
* ok — the binary resolves AND the side-effect-free probe exits 0.
|
|
15
|
+
* missing — the binary does not resolve on PATH at all.
|
|
16
|
+
* broken — the binary resolves but the probe fails in a way that means a
|
|
17
|
+
* damaged install: exit 126 / 127, an `EACCES` on a path that
|
|
18
|
+
* passed the executable check, or a resolvable shim whose
|
|
19
|
+
* interpreter is gone (the **stale-shim** case: resolution finds
|
|
20
|
+
* the file, executing it fails `ENOENT`).
|
|
21
|
+
* timeout — the probe exceeded its per-probe deadline.
|
|
22
|
+
* error — anything else, captured and attributed to this descriptor only
|
|
23
|
+
* (including a probe that ran and exited non-zero with a code
|
|
24
|
+
* other than 126 / 127 — the tool is installed but disagrees).
|
|
25
|
+
*
|
|
26
|
+
* Non-negotiables:
|
|
27
|
+
*
|
|
28
|
+
* - **Every spawn goes through `hardenedSpawnEnv()`** (ADR-123): the probe
|
|
29
|
+
* runs external binaries, so the loader / git-config / runtime-auto-exec
|
|
30
|
+
* injection vectors are scrubbed from the child env. PATH resolution walks
|
|
31
|
+
* the *same* hardened env, so "what we resolved" and "what we executed"
|
|
32
|
+
* can never diverge.
|
|
33
|
+
* - **Side-effect-free probes only.** The caller supplies the args
|
|
34
|
+
* (`--version`, `--help`, a status subcommand). This module never invents
|
|
35
|
+
* args and never runs an install / update / login / write command.
|
|
36
|
+
* - **Retry applies to `timeout` ONLY** — exactly one retry, never for
|
|
37
|
+
* `missing`, `broken` or `error`. A missing binary will still be missing.
|
|
38
|
+
* - **Never throws.** A malformed descriptor, an invalid arg, a hostile
|
|
39
|
+
* filesystem — all become a returned `error` result. One bad backend must
|
|
40
|
+
* not take down a caller iterating over many.
|
|
41
|
+
* - **No network, no config reading.** The descriptor is passed in; the
|
|
42
|
+
* `fix` prescription is echoed from it. This module invents no install
|
|
43
|
+
* command of its own.
|
|
44
|
+
*
|
|
45
|
+
* Child stdio is fully ignored: the verdict is the exit status, capturing
|
|
46
|
+
* output would risk pulling credentials / fetched content into a report, and
|
|
47
|
+
* an ignored stdio cannot hang on a grandchild holding the pipe open after a
|
|
48
|
+
* timeout kill.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
import { spawnSync } from 'node:child_process';
|
|
52
|
+
import type { SpawnSyncOptions } from 'node:child_process';
|
|
53
|
+
import * as fs from 'node:fs';
|
|
54
|
+
import * as path from 'node:path';
|
|
55
|
+
|
|
56
|
+
import { hardenedSpawnEnv } from './spawn_env.js';
|
|
57
|
+
|
|
58
|
+
/** The five states. Nothing else is representable. */
|
|
59
|
+
export type ToolProbeStatus = 'ok' | 'missing' | 'broken' | 'timeout' | 'error';
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A platform-keyed prescription, e.g.
|
|
63
|
+
* `{ darwin: 'brew install gh@2.62.0', default: 'see docs/…' }`.
|
|
64
|
+
* Resolved by `process.platform`, falling back to `default`. The strings are
|
|
65
|
+
* the caller's — this module only selects and echoes.
|
|
66
|
+
*/
|
|
67
|
+
export type FixPrescription = string | Readonly<Record<string, string>>;
|
|
68
|
+
|
|
69
|
+
/** One backend to probe. Registry-shaped (snake_case), never guessed. */
|
|
70
|
+
export interface ToolProbeDescriptor {
|
|
71
|
+
/** Stable id echoed into the result (channel / backend name). */
|
|
72
|
+
name: string;
|
|
73
|
+
/** Binary name resolved on PATH, or an explicit absolute / relative path. */
|
|
74
|
+
bin: string;
|
|
75
|
+
/** Side-effect-free probe args. Empty means "run the bare binary". */
|
|
76
|
+
probe_args?: readonly string[];
|
|
77
|
+
/** Per-probe deadline. Defaults to {@link DEFAULT_TIMEOUT_MS}. */
|
|
78
|
+
timeout_ms?: number;
|
|
79
|
+
/** Human-run prescription echoed on `missing` / `broken`. */
|
|
80
|
+
fix?: FixPrescription;
|
|
81
|
+
/** Env overrides handed to `hardenedSpawnEnv()` (e.g. a scoped PATH). */
|
|
82
|
+
env?: Readonly<Record<string, string>>;
|
|
83
|
+
/** Working directory for the probe. Defaults to the caller's cwd. */
|
|
84
|
+
cwd?: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** JSON-serialisable verdict for exactly one descriptor. */
|
|
88
|
+
export interface ToolProbeResult {
|
|
89
|
+
name: string;
|
|
90
|
+
bin: string;
|
|
91
|
+
status: ToolProbeStatus;
|
|
92
|
+
/** Resolved binary path, or `null` when resolution failed. */
|
|
93
|
+
path: string | null;
|
|
94
|
+
/** Child exit code, or `null` when the child never reported one. */
|
|
95
|
+
exit_code: number | null;
|
|
96
|
+
/** Terminating signal, or `null`. `SIGTERM` accompanies a timeout kill. */
|
|
97
|
+
signal: string | null;
|
|
98
|
+
/** Probe invocations actually performed (2 only on the timeout retry). */
|
|
99
|
+
attempts: number;
|
|
100
|
+
/** Deadline applied per attempt. */
|
|
101
|
+
timeout_ms: number;
|
|
102
|
+
/** Short, output-free explanation of the verdict. */
|
|
103
|
+
diagnostic: string;
|
|
104
|
+
/** Echoed prescription — populated for `missing` / `broken` only. */
|
|
105
|
+
fix: string | null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Default per-probe deadline: generous for a cold `--version`, still bounded. */
|
|
109
|
+
export const DEFAULT_TIMEOUT_MS = 5_000;
|
|
110
|
+
|
|
111
|
+
/** Exit codes that mean "resolvable but damaged" rather than "disagrees". */
|
|
112
|
+
const BROKEN_EXIT_CODES: ReadonlySet<number> = new Set([126, 127]);
|
|
113
|
+
|
|
114
|
+
/** Resolve the platform-appropriate prescription; `null` when none was given. */
|
|
115
|
+
function resolveFix(fix: FixPrescription | undefined): string | null {
|
|
116
|
+
if (fix === undefined) return null;
|
|
117
|
+
if (typeof fix === 'string') return fix.trim() === '' ? null : fix;
|
|
118
|
+
const exact = fix[process.platform];
|
|
119
|
+
if (typeof exact === 'string' && exact.trim() !== '') return exact;
|
|
120
|
+
const fallback = fix['default'];
|
|
121
|
+
if (typeof fallback === 'string' && fallback.trim() !== '') return fallback;
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function isExecutableFile(candidate: string): boolean {
|
|
126
|
+
try {
|
|
127
|
+
if (!fs.statSync(candidate).isFile()) return false;
|
|
128
|
+
} catch {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (process.platform === 'win32') {
|
|
132
|
+
// X_OK is not meaningful on Windows; extension carries executability.
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
fs.accessSync(candidate, fs.constants.X_OK);
|
|
137
|
+
return true;
|
|
138
|
+
} catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function looksLikePath(bin: string): boolean {
|
|
144
|
+
return bin.includes('/') || (process.platform === 'win32' && bin.includes('\\'));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* PATH resolution over the **hardened** env — the same env the probe will run
|
|
149
|
+
* under. Returns the resolved path, or `null` for `missing`.
|
|
150
|
+
*/
|
|
151
|
+
function resolveBinary(bin: string, env: NodeJS.ProcessEnv): string | null {
|
|
152
|
+
if (bin.trim() === '') return null;
|
|
153
|
+
if (looksLikePath(bin)) {
|
|
154
|
+
const direct = path.resolve(bin);
|
|
155
|
+
return isExecutableFile(direct) ? direct : null;
|
|
156
|
+
}
|
|
157
|
+
const pathValue = env['PATH'] ?? env['Path'] ?? '';
|
|
158
|
+
const extensions =
|
|
159
|
+
process.platform === 'win32'
|
|
160
|
+
? (env['PATHEXT'] ?? '.COM;.EXE;.BAT;.CMD').split(';').filter((e) => e !== '')
|
|
161
|
+
: [''];
|
|
162
|
+
for (const dir of pathValue.split(path.delimiter)) {
|
|
163
|
+
if (dir === '') continue;
|
|
164
|
+
for (const ext of extensions) {
|
|
165
|
+
const candidate = path.join(dir, `${bin}${ext}`);
|
|
166
|
+
if (isExecutableFile(candidate)) return candidate;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
interface Attempt {
|
|
173
|
+
status: number | null;
|
|
174
|
+
signal: string | null;
|
|
175
|
+
errorCode: string | null;
|
|
176
|
+
timedOut: boolean;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function runOnce(
|
|
180
|
+
resolved: string,
|
|
181
|
+
args: readonly string[],
|
|
182
|
+
timeoutMs: number,
|
|
183
|
+
env: NodeJS.ProcessEnv,
|
|
184
|
+
cwd: string | undefined,
|
|
185
|
+
): Attempt {
|
|
186
|
+
const options: SpawnSyncOptions = {
|
|
187
|
+
env,
|
|
188
|
+
timeout: timeoutMs,
|
|
189
|
+
// See the module header: verdict is the exit status, never the output.
|
|
190
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
191
|
+
windowsHide: true,
|
|
192
|
+
};
|
|
193
|
+
if (cwd !== undefined) options.cwd = cwd;
|
|
194
|
+
const result = spawnSync(resolved, [...args], options);
|
|
195
|
+
// Node attaches the libuv code (`ENOENT` / `EACCES` / `ETIMEDOUT`) to the
|
|
196
|
+
// spawn error; it is not part of the declared `Error` shape.
|
|
197
|
+
const raw = result.error as (Error & { code?: unknown }) | undefined;
|
|
198
|
+
const errorCode = typeof raw?.code === 'string' ? raw.code : null;
|
|
199
|
+
return {
|
|
200
|
+
status: result.status ?? null,
|
|
201
|
+
signal: result.signal ?? null,
|
|
202
|
+
errorCode,
|
|
203
|
+
// Node reports a deadline kill as ETIMEDOUT; the SIGTERM+no-status
|
|
204
|
+
// shape is the belt-and-braces reading for hosts that omit the code.
|
|
205
|
+
timedOut:
|
|
206
|
+
errorCode === 'ETIMEDOUT' ||
|
|
207
|
+
(result.status === null && result.signal === 'SIGTERM' && errorCode === null),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function classify(resolved: string, attempt: Attempt, timeoutMs: number, attempts: number): {
|
|
212
|
+
status: ToolProbeStatus;
|
|
213
|
+
diagnostic: string;
|
|
214
|
+
} {
|
|
215
|
+
if (attempt.timedOut) {
|
|
216
|
+
return {
|
|
217
|
+
status: 'timeout',
|
|
218
|
+
diagnostic: `probe exceeded the ${timeoutMs}ms deadline after ${attempts} attempt(s)`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (attempt.errorCode === 'ENOENT') {
|
|
222
|
+
// Resolution found the file, exec said it is not there → the shebang
|
|
223
|
+
// interpreter is gone. This is the stale-shim case.
|
|
224
|
+
return {
|
|
225
|
+
status: 'broken',
|
|
226
|
+
diagnostic: `resolved at ${resolved} but exec failed ENOENT — stale shim (interpreter missing)`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
if (attempt.errorCode === 'EACCES') {
|
|
230
|
+
return {
|
|
231
|
+
status: 'broken',
|
|
232
|
+
diagnostic: `resolved at ${resolved} but exec failed EACCES — not executable as installed`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
if (attempt.errorCode !== null) {
|
|
236
|
+
return {
|
|
237
|
+
status: 'error',
|
|
238
|
+
diagnostic: `probe spawn failed ${attempt.errorCode}`,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if (attempt.status === 0) {
|
|
242
|
+
return { status: 'ok', diagnostic: `probe exited 0 (${resolved})` };
|
|
243
|
+
}
|
|
244
|
+
if (attempt.status !== null && BROKEN_EXIT_CODES.has(attempt.status)) {
|
|
245
|
+
return {
|
|
246
|
+
status: 'broken',
|
|
247
|
+
diagnostic: `probe exited ${attempt.status} — damaged install (command not found / not executable inside the wrapper)`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
if (attempt.status !== null) {
|
|
251
|
+
return { status: 'error', diagnostic: `probe exited ${attempt.status}` };
|
|
252
|
+
}
|
|
253
|
+
return {
|
|
254
|
+
status: 'error',
|
|
255
|
+
diagnostic: `probe reported no exit status${attempt.signal !== null ? ` (signal ${attempt.signal})` : ''}`,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Probe one backend. Returns a verdict; **never throws**.
|
|
261
|
+
*
|
|
262
|
+
* @param descriptor the backend to probe. Everything the probe needs —
|
|
263
|
+
* binary, side-effect-free args, deadline, and the `fix` prescription echoed
|
|
264
|
+
* on `missing` / `broken` — comes from here. No config or network read.
|
|
265
|
+
*/
|
|
266
|
+
export function probeTool(descriptor: ToolProbeDescriptor): ToolProbeResult {
|
|
267
|
+
// Types are a compile-time promise, not a runtime one: a descriptor built
|
|
268
|
+
// from a YAML registry can carry anything (or be nullish), so every read
|
|
269
|
+
// below is defensive and the whole body is inside the never-throw guard.
|
|
270
|
+
let timeoutMs = DEFAULT_TIMEOUT_MS;
|
|
271
|
+
const base: ToolProbeResult = {
|
|
272
|
+
name: '(unnamed)',
|
|
273
|
+
bin: '',
|
|
274
|
+
status: 'error',
|
|
275
|
+
path: null,
|
|
276
|
+
exit_code: null,
|
|
277
|
+
signal: null,
|
|
278
|
+
attempts: 0,
|
|
279
|
+
timeout_ms: timeoutMs,
|
|
280
|
+
diagnostic: 'probe did not run',
|
|
281
|
+
fix: null,
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
try {
|
|
285
|
+
const name = typeof descriptor?.name === 'string' ? descriptor.name : '(unnamed)';
|
|
286
|
+
const bin = typeof descriptor?.bin === 'string' ? descriptor.bin : '';
|
|
287
|
+
base.name = name;
|
|
288
|
+
base.bin = bin;
|
|
289
|
+
|
|
290
|
+
const requested = descriptor.timeout_ms;
|
|
291
|
+
if (typeof requested === 'number' && Number.isFinite(requested) && requested > 0) {
|
|
292
|
+
timeoutMs = Math.floor(requested);
|
|
293
|
+
}
|
|
294
|
+
base.timeout_ms = timeoutMs;
|
|
295
|
+
const fix = resolveFix(descriptor.fix);
|
|
296
|
+
|
|
297
|
+
if (bin.trim() === '') {
|
|
298
|
+
return {
|
|
299
|
+
...base,
|
|
300
|
+
status: 'error',
|
|
301
|
+
diagnostic: 'descriptor carries no binary to probe',
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const env = hardenedSpawnEnv({ ...(descriptor.env ?? {}) });
|
|
306
|
+
const resolved = resolveBinary(bin, env);
|
|
307
|
+
if (resolved === null) {
|
|
308
|
+
return {
|
|
309
|
+
...base,
|
|
310
|
+
status: 'missing',
|
|
311
|
+
diagnostic: `'${bin}' does not resolve on PATH`,
|
|
312
|
+
fix,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const args = descriptor.probe_args ?? [];
|
|
317
|
+
const cwd = descriptor.cwd;
|
|
318
|
+
|
|
319
|
+
let attempts = 0;
|
|
320
|
+
let attempt = runOnce(resolved, args, timeoutMs, env, cwd);
|
|
321
|
+
attempts += 1;
|
|
322
|
+
// Retry ONLY a timeout, and only once. `missing` / `broken` / `error`
|
|
323
|
+
// are stable verdicts — retrying them just burns the deadline twice.
|
|
324
|
+
if (attempt.timedOut) {
|
|
325
|
+
attempt = runOnce(resolved, args, timeoutMs, env, cwd);
|
|
326
|
+
attempts += 1;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const verdict = classify(resolved, attempt, timeoutMs, attempts);
|
|
330
|
+
return {
|
|
331
|
+
...base,
|
|
332
|
+
status: verdict.status,
|
|
333
|
+
path: resolved,
|
|
334
|
+
exit_code: attempt.status,
|
|
335
|
+
signal: attempt.signal,
|
|
336
|
+
attempts,
|
|
337
|
+
diagnostic: verdict.diagnostic,
|
|
338
|
+
fix: verdict.status === 'missing' || verdict.status === 'broken' ? fix : null,
|
|
339
|
+
};
|
|
340
|
+
} catch (err) {
|
|
341
|
+
// The never-throw guarantee. An invalid arg, a RangeError deadline, a
|
|
342
|
+
// filesystem that lies — all land here as this descriptor's `error`.
|
|
343
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
344
|
+
return {
|
|
345
|
+
...base,
|
|
346
|
+
status: 'error',
|
|
347
|
+
timeout_ms: timeoutMs,
|
|
348
|
+
diagnostic: `probe raised unexpectedly: ${message}`,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Probe many descriptors, isolating failures: one hostile descriptor becomes
|
|
355
|
+
* its own `error` row and every other backend is still reported.
|
|
356
|
+
*/
|
|
357
|
+
export function probeTools(descriptors: readonly ToolProbeDescriptor[]): ToolProbeResult[] {
|
|
358
|
+
return descriptors.map((descriptor) => probeTool(descriptor));
|
|
359
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-worker token stop-loss (L0b — road-to-lean-agent-init Phase 2).
|
|
3
|
+
*
|
|
4
|
+
* Pure, no-I/O. A dispatched worker carries a hard `max_tokens_per_worker`
|
|
5
|
+
* budget keyed by its resolved tier; on hit it returns a STRUCTURED PARTIAL
|
|
6
|
+
* RESULT + escalation flag to the orchestrator instead of continuing to
|
|
7
|
+
* explore. Live evidence (2026-07-28): four lookup-class workers burned
|
|
8
|
+
* 280–327k tokens each — a worker overrunning its budget 20× is a dispatch
|
|
9
|
+
* error on the wrong rung, not diligence.
|
|
10
|
+
*
|
|
11
|
+
* Composes with — replaces nothing:
|
|
12
|
+
* - the N=3 validation-loop budget (`autonomous-execution`),
|
|
13
|
+
* - the ADR-109 / `subagent-response-contract` body + 4-status envelope
|
|
14
|
+
* (`subagent-steering`): the partial result rides as the body of a
|
|
15
|
+
* `BLOCKED` envelope with `budget_hit: true` as the escalation flag.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { Tier } from './subagent_routing.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Start values — refined from Phase-3 telemetry (`budget_hit` rate in the
|
|
22
|
+
* audit stream), never final. `lite` is the roadmap-pinned lookup-class
|
|
23
|
+
* start value (~15k); `medium`/`high` are conservative seeds an order of
|
|
24
|
+
* magnitude below the observed 280–327k runaway runs.
|
|
25
|
+
*/
|
|
26
|
+
export const MAX_TOKENS_PER_WORKER: Readonly<Record<Exclude<Tier, 'inherit'>, number>> = {
|
|
27
|
+
lite: 15_000,
|
|
28
|
+
medium: 60_000,
|
|
29
|
+
high: 150_000,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** Resolve the budget for a worker's tier; `inherit` uses the session tier's budget. */
|
|
33
|
+
export function budgetForTier(tier: Tier, sessionTier: Exclude<Tier, 'inherit'> = 'high'): number {
|
|
34
|
+
const effective = tier === 'inherit' ? sessionTier : tier;
|
|
35
|
+
return MAX_TOKENS_PER_WORKER[effective];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Where the orchestrator should send the task after a budget hit. */
|
|
39
|
+
export type NextRung = 'primitive' | 'higher-tier-subagent' | 'in-session';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The structured partial result a budget-hit worker returns. Body of a
|
|
43
|
+
* `BLOCKED` envelope; `budget_hit: true` IS the escalation flag. Refs, not
|
|
44
|
+
* bodies — same privacy floor as the spawn/response contracts.
|
|
45
|
+
*/
|
|
46
|
+
export interface WorkerPartialResult {
|
|
47
|
+
budget_hit: true;
|
|
48
|
+
/** What was found so far — ref tokens (`file:line`, ids, paths), never bodies. */
|
|
49
|
+
found: string[];
|
|
50
|
+
/** What remains unexplored, one plain sentence. */
|
|
51
|
+
remaining: string;
|
|
52
|
+
/** Suggested next rung for the remainder. */
|
|
53
|
+
suggested_next_rung: NextRung;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const NEXT_RUNGS: ReadonlySet<string> = new Set<NextRung>(['primitive', 'higher-tier-subagent', 'in-session']);
|
|
57
|
+
|
|
58
|
+
/** Ref-like guard — mirrors the spawn contract's refs-not-bodies invariant. */
|
|
59
|
+
function isRefLike(s: unknown): s is string {
|
|
60
|
+
return typeof s === 'string' && s.length > 0 && s.length <= 200 && !s.includes('\n');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface BudgetEvaluation {
|
|
64
|
+
budget_hit: boolean;
|
|
65
|
+
consumed: number;
|
|
66
|
+
budget: number;
|
|
67
|
+
reason: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Evaluate consumption against the worker's budget. */
|
|
71
|
+
export function evaluateWorkerBudget(consumed: number, budget: number): BudgetEvaluation {
|
|
72
|
+
const hit = consumed >= budget;
|
|
73
|
+
return {
|
|
74
|
+
budget_hit: hit,
|
|
75
|
+
consumed,
|
|
76
|
+
budget,
|
|
77
|
+
reason: hit
|
|
78
|
+
? `budget hit (${consumed} >= ${budget}) — return partial result + escalation flag, stop exploring`
|
|
79
|
+
: `within budget (${consumed} < ${budget})`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Validate a partial-result body. Returns the list of violations (empty =
|
|
85
|
+
* valid). The orchestrator never adopts an invalid partial return — it
|
|
86
|
+
* re-dispatches or resolves in-session per the synthesis duties.
|
|
87
|
+
*/
|
|
88
|
+
export function validateWorkerPartialResult(input: unknown): string[] {
|
|
89
|
+
const errors: string[] = [];
|
|
90
|
+
if (typeof input !== 'object' || input === null) return ['not an object'];
|
|
91
|
+
const r = input as Record<string, unknown>;
|
|
92
|
+
|
|
93
|
+
if (r['budget_hit'] !== true) errors.push('budget_hit must be literally true (the escalation flag)');
|
|
94
|
+
if (!Array.isArray(r['found'])) {
|
|
95
|
+
errors.push('found must be an array of ref tokens');
|
|
96
|
+
} else {
|
|
97
|
+
const bodyLike = (r['found'] as unknown[]).filter((x) => !isRefLike(x));
|
|
98
|
+
if (bodyLike.length > 0) errors.push(`found carries ${bodyLike.length} non-ref entr${bodyLike.length === 1 ? 'y' : 'ies'} (refs only, no bodies)`);
|
|
99
|
+
}
|
|
100
|
+
if (typeof r['remaining'] !== 'string' || (r['remaining'] as string).length === 0) {
|
|
101
|
+
errors.push('remaining must be a non-empty sentence');
|
|
102
|
+
}
|
|
103
|
+
if (typeof r['suggested_next_rung'] !== 'string' || !NEXT_RUNGS.has(r['suggested_next_rung'] as string)) {
|
|
104
|
+
errors.push(`suggested_next_rung must be one of ${[...NEXT_RUNGS].join(' | ')}`);
|
|
105
|
+
}
|
|
106
|
+
return errors;
|
|
107
|
+
}
|
|
@@ -159,9 +159,15 @@ export function scan(d: string): [Row[], Row[], string[]] {
|
|
|
159
159
|
for (const r of num) {
|
|
160
160
|
const s = r.supersedes ?? '—';
|
|
161
161
|
if (s && s !== '—') {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
162
|
+
// Comma-separated refs; a parenthesized annotation per ref marks
|
|
163
|
+
// partial supersession (house precedent: ADR-098's superseded_by).
|
|
164
|
+
for (const ref of s.split(',')) {
|
|
165
|
+
const bare = ref.replace(/\(.*?\)/g, '').trim();
|
|
166
|
+
if (!bare) continue;
|
|
167
|
+
const t = _zfill3(_lstripZeros(bare.replaceAll('ADR-', '')));
|
|
168
|
+
if (!nums.has(t)) {
|
|
169
|
+
errs.push(`${r.path}: supersedes ADR-${t} not found`);
|
|
170
|
+
}
|
|
165
171
|
}
|
|
166
172
|
}
|
|
167
173
|
}
|
|
@@ -179,21 +185,90 @@ export function row(r: Row): string {
|
|
|
179
185
|
);
|
|
180
186
|
}
|
|
181
187
|
|
|
188
|
+
/**
|
|
189
|
+
* Decision records that live outside the ADR directory.
|
|
190
|
+
*
|
|
191
|
+
* Six files under `agents/settings/contexts/` are titled `# ADR — …`, carry a
|
|
192
|
+
* decision status, and had **zero** presence in this index — ADRs by every
|
|
193
|
+
* property except location. A decision nobody can find is a trap: later work
|
|
194
|
+
* contradicts it without knowing it existed, which is the failure ADR-124 paid
|
|
195
|
+
* for with a hand-built 44-entry archaeology sweep.
|
|
196
|
+
*
|
|
197
|
+
* Listing beats relocating, deliberately. Moving them would mean renumbering six
|
|
198
|
+
* records and rewriting ~15 inbound references, ten of them inside frozen
|
|
199
|
+
* archived roadmaps whose paths were correct when written — rewriting history to
|
|
200
|
+
* fix an index. The harm is findability, not location, so the index reaches out
|
|
201
|
+
* instead. A scan also keeps working for the next file filed in the wrong place,
|
|
202
|
+
* which a one-time move would not.
|
|
203
|
+
*/
|
|
204
|
+
const OUTSIDE_ROOTS = ['agents/settings/contexts'];
|
|
205
|
+
const DECISION_TITLE = /^#\s*ADR\s*[—–-]\s*(.+)$/m;
|
|
206
|
+
|
|
207
|
+
export interface OutsideRow {
|
|
208
|
+
path: string;
|
|
209
|
+
title: string;
|
|
210
|
+
status: string;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function scanOutside(repoRoot: string, roots: readonly string[] = OUTSIDE_ROOTS): OutsideRow[] {
|
|
214
|
+
const out: OutsideRow[] = [];
|
|
215
|
+
for (const rel of roots) {
|
|
216
|
+
const dir = _pyPathJoin(repoRoot, rel);
|
|
217
|
+
let names: string[];
|
|
218
|
+
try {
|
|
219
|
+
names = fs.readdirSync(dir);
|
|
220
|
+
} catch {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
for (const name of names.slice().sort()) {
|
|
224
|
+
if (!name.endsWith('.md')) continue;
|
|
225
|
+
const text = fs.readFileSync(_pyPathJoin(dir, name), 'utf-8');
|
|
226
|
+
const m = DECISION_TITLE.exec(text);
|
|
227
|
+
if (!m) continue;
|
|
228
|
+
const status =
|
|
229
|
+
/^\s*>?\s*\*\*Status:\*\*\s*(.+)$/m.exec(text)?.[1] ??
|
|
230
|
+
/^status:\s*(.+)$/m.exec(text)?.[1] ??
|
|
231
|
+
'—';
|
|
232
|
+
out.push({
|
|
233
|
+
path: `${rel}/${name}`,
|
|
234
|
+
title: (m[1] ?? name).trim(),
|
|
235
|
+
status: status.trim().replace(/\s*·.*$/, ''),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return out;
|
|
240
|
+
}
|
|
241
|
+
|
|
182
242
|
/** Mirror `render(num, leg)`. */
|
|
183
|
-
export function render(num: Row[], leg: Row[]): string {
|
|
243
|
+
export function render(num: Row[], leg: Row[], outside: OutsideRow[] = []): string {
|
|
184
244
|
const out = [
|
|
185
245
|
'# ADR Index',
|
|
186
246
|
'',
|
|
187
247
|
'_Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._',
|
|
188
248
|
'',
|
|
189
249
|
];
|
|
190
|
-
if (num.length === 0 && leg.length === 0) {
|
|
250
|
+
if (num.length === 0 && leg.length === 0 && outside.length === 0) {
|
|
191
251
|
return [...out, 'No ADRs yet.', ''].join('\n');
|
|
192
252
|
}
|
|
193
253
|
out.push(HEAD, ...num.map(row));
|
|
194
254
|
if (leg.length > 0) {
|
|
195
255
|
out.push('', '## Unnumbered (legacy)', '', HEAD, ...leg.map(row));
|
|
196
256
|
}
|
|
257
|
+
if (outside.length > 0) {
|
|
258
|
+
out.push(
|
|
259
|
+
'',
|
|
260
|
+
'## Decision records outside this directory',
|
|
261
|
+
'',
|
|
262
|
+
'Scanned, not hand-listed. These files are titled `# ADR — …` and record a',
|
|
263
|
+
'decision, but live elsewhere in the tree. They are indexed here so a decision',
|
|
264
|
+
'cannot be unfindable merely because of where it was filed; their paths are',
|
|
265
|
+
'unchanged and their inbound references still resolve.',
|
|
266
|
+
'',
|
|
267
|
+
'| File | Title | Status |',
|
|
268
|
+
'|---|---|---|',
|
|
269
|
+
...outside.map((o) => `| \`${o.path}\` | ${o.title} | ${o.status} |`),
|
|
270
|
+
);
|
|
271
|
+
}
|
|
197
272
|
return [...out, ''].join('\n');
|
|
198
273
|
}
|
|
199
274
|
|
|
@@ -229,7 +304,7 @@ export function main(argv: string[] = process.argv.slice(2)): number {
|
|
|
229
304
|
if (errs.length > 0) {
|
|
230
305
|
return 2;
|
|
231
306
|
}
|
|
232
|
-
const rendered = render(num, leg);
|
|
307
|
+
const rendered = render(num, leg, scanOutside(process.cwd()));
|
|
233
308
|
const idx = _pyPathJoin(d, 'INDEX.md');
|
|
234
309
|
if (check) {
|
|
235
310
|
let cur = '';
|
|
Binary file
|
|
@@ -915,10 +915,15 @@ function _build_model_downgrade(d: Dict): ModelDowngradeConfig {
|
|
|
915
915
|
if (!_isBool(enabled)) {
|
|
916
916
|
throw new CouncilConfigError('`model_downgrade.enabled` must be a bool.');
|
|
917
917
|
}
|
|
918
|
-
//
|
|
919
|
-
//
|
|
920
|
-
//
|
|
921
|
-
|
|
918
|
+
// 2026-07-28 (road-to-feedback-9.8.0-followups Phase 3): auto_apply
|
|
919
|
+
// default downgraded back to FALSE (suggest, don't silently apply). The
|
|
920
|
+
// A3 flip to TRUE (2026-07-20) shipped without a paired quality
|
|
921
|
+
// measurement and was the only default-ON surface without one (R7
|
|
922
|
+
// watch-item); until a paired eval measures downgraded-member council
|
|
923
|
+
// quality, the downgrade surfaces as a suggestion the caller applies
|
|
924
|
+
// explicitly. Revisit: a paired eval (full-tier vs downgraded, blind
|
|
925
|
+
// judge) showing held quality re-flips this to true.
|
|
926
|
+
const auto_apply = _get(d, 'auto_apply', false);
|
|
922
927
|
if (!_isBool(auto_apply)) {
|
|
923
928
|
throw new CouncilConfigError('`model_downgrade.auto_apply` must be a bool.');
|
|
924
929
|
}
|
|
@@ -1331,8 +1336,9 @@ function _build_lens_overrides(d: Dict): LensOverridesConfig {
|
|
|
1331
1336
|
`\`lenses.${lens_name}.model_downgrade.enabled\` must be a bool.`,
|
|
1332
1337
|
);
|
|
1333
1338
|
}
|
|
1334
|
-
// Lens overrides inherit the
|
|
1335
|
-
|
|
1339
|
+
// Lens overrides inherit the suggest-by-default posture
|
|
1340
|
+
// (2026-07-28 downgrade of the unmeasured A3 auto-default).
|
|
1341
|
+
const md_auto = _get(md_block, 'auto_apply', false);
|
|
1336
1342
|
if (!_isBool(md_auto)) {
|
|
1337
1343
|
throw new CouncilConfigError(
|
|
1338
1344
|
`\`lenses.${lens_name}.model_downgrade.auto_apply\` must be a bool.`,
|