@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
package/src/scripts/release.ts
CHANGED
|
@@ -1451,9 +1451,30 @@ function execute(
|
|
|
1451
1451
|
// publish that already happened.
|
|
1452
1452
|
if (ci) {
|
|
1453
1453
|
_step(9, total, 'Dispatch release-guard.yml + publish-npm.yml + cloud-release.yml for the tag');
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1454
|
+
// NON-FATAL by design. By this point the release is already complete
|
|
1455
|
+
// — the tag is pushed and the GitHub Release is created above, and
|
|
1456
|
+
// npm publish runs asynchronously. These explicit dispatches are a
|
|
1457
|
+
// FALLBACK for a tag pushed with the default GITHUB_TOKEN, which does
|
|
1458
|
+
// NOT fire tag-triggered workflows (GitHub's recursion guard). When
|
|
1459
|
+
// the tag was pushed with a PAT (RELEASE_PR_TOKEN), those three
|
|
1460
|
+
// workflows already fired on the push and this dispatch is redundant.
|
|
1461
|
+
// Dispatching via the API additionally needs the token's
|
|
1462
|
+
// `actions:write` scope; a 403 here (scope missing) must NOT mark an
|
|
1463
|
+
// already-shipped release as failed — warn and continue.
|
|
1464
|
+
for (const wf of ['release-guard.yml', 'publish-npm.yml', 'cloud-release.yml']) {
|
|
1465
|
+
const r = run(['gh', 'workflow', 'run', wf, '--ref', MAIN_BRANCH, '-f', `tag=${plan.target}`], {
|
|
1466
|
+
check: false,
|
|
1467
|
+
});
|
|
1468
|
+
if (r.returncode !== 0) {
|
|
1469
|
+
process.stderr.write(
|
|
1470
|
+
`⚠️ Could not dispatch ${wf} (exit ${r.returncode}) — the release ${plan.target} is ` +
|
|
1471
|
+
`already complete (tag + GitHub Release created; npm publishes async). If the tag was ` +
|
|
1472
|
+
`pushed with a PAT, ${wf} already fired on the tag push. If you rely on the explicit ` +
|
|
1473
|
+
`dispatch, grant RELEASE_PR_TOKEN the "Actions: read and write" scope (fine-grained PAT) ` +
|
|
1474
|
+
`or the "workflow" scope (classic PAT).\n`,
|
|
1475
|
+
);
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1457
1478
|
}
|
|
1458
1479
|
}
|
|
1459
1480
|
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Installer drift report — measures, never gates.
|
|
4
|
+
*
|
|
5
|
+
* Compares the sha256 hashes recorded in `agents/installed-tools.lock`
|
|
6
|
+
* (`kind: 'deployed'` entries) against the current on-disk content of those
|
|
7
|
+
* same files and reports anything locally modified or deleted since the
|
|
8
|
+
* last install/upgrade. This is telemetry for the "do consumers edit
|
|
9
|
+
* framework-authoritative files" premise — it is NEVER a gate. The drift
|
|
10
|
+
* report itself always exits 0 regardless of what it finds; only a usage
|
|
11
|
+
* error (unknown flag, missing value) exits non-zero, matching the rest of
|
|
12
|
+
* this package's CLI scripts.
|
|
13
|
+
*
|
|
14
|
+
* `install.ts`'s global-install upgrade path calls the same
|
|
15
|
+
* `_lib/install_drift.ts` library directly (not this CLI) and always
|
|
16
|
+
* proceeds with the redeploy regardless of what the report finds.
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* ./scripts-run src/scripts/report_install_drift
|
|
20
|
+
* ./scripts-run src/scripts/report_install_drift --project <path>
|
|
21
|
+
* ./scripts-run src/scripts/report_install_drift --format json
|
|
22
|
+
*
|
|
23
|
+
* Exit codes: 0 report emitted (clean or drifted) · 2 usage error.
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from "node:fs";
|
|
26
|
+
import * as path from "node:path";
|
|
27
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
28
|
+
|
|
29
|
+
import { collect_drift, format_drift_report } from "./_lib/install_drift.js";
|
|
30
|
+
|
|
31
|
+
interface Options {
|
|
32
|
+
project: string;
|
|
33
|
+
format: "text" | "json";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function fail(message: string): never {
|
|
37
|
+
process.stderr.write(`❌ report_install_drift: ${message}\n`);
|
|
38
|
+
process.exit(2);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function _parse(argv: string[]): Options {
|
|
42
|
+
const opts: Options = { project: process.cwd(), format: "text" };
|
|
43
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
44
|
+
const arg = argv[i];
|
|
45
|
+
if (arg === "--help" || arg === "-h") {
|
|
46
|
+
process.stdout.write(
|
|
47
|
+
"usage: report_install_drift [--project <path>] [--format text|json]\n",
|
|
48
|
+
);
|
|
49
|
+
process.exit(0);
|
|
50
|
+
} else if (arg === "--project") {
|
|
51
|
+
const value = argv[i + 1];
|
|
52
|
+
if (value === undefined) fail("--project requires a value");
|
|
53
|
+
opts.project = path.resolve(value);
|
|
54
|
+
i += 1;
|
|
55
|
+
} else if (arg === "--format") {
|
|
56
|
+
const value = argv[i + 1];
|
|
57
|
+
if (value !== "text" && value !== "json") {
|
|
58
|
+
fail(`--format must be 'text' or 'json' (got ${JSON.stringify(value ?? null)})`);
|
|
59
|
+
}
|
|
60
|
+
opts.format = value;
|
|
61
|
+
i += 1;
|
|
62
|
+
} else {
|
|
63
|
+
fail(`unknown argument: ${arg}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return opts;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Run the report and print it. Always returns 0 — the finding is telemetry,
|
|
71
|
+
* never a build/CI failure signal.
|
|
72
|
+
*/
|
|
73
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
74
|
+
const opts = _parse(argv);
|
|
75
|
+
const entries = collect_drift(opts.project);
|
|
76
|
+
|
|
77
|
+
if (opts.format === "json") {
|
|
78
|
+
process.stdout.write(
|
|
79
|
+
`${JSON.stringify(
|
|
80
|
+
{
|
|
81
|
+
project_root: opts.project,
|
|
82
|
+
manifest_found: entries !== null,
|
|
83
|
+
drift: entries ?? [],
|
|
84
|
+
},
|
|
85
|
+
null,
|
|
86
|
+
2,
|
|
87
|
+
)}\n`,
|
|
88
|
+
);
|
|
89
|
+
} else {
|
|
90
|
+
process.stdout.write(format_drift_report(entries));
|
|
91
|
+
}
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Main-guard (realpath-compared, mirrors the repo convention).
|
|
96
|
+
if (process.argv[1] !== undefined) {
|
|
97
|
+
try {
|
|
98
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
99
|
+
const argv1 = fs.realpathSync(path.resolve(process.argv[1]));
|
|
100
|
+
if (here === argv1) {
|
|
101
|
+
process.exit(main(process.argv.slice(2)));
|
|
102
|
+
}
|
|
103
|
+
} catch {
|
|
104
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
105
|
+
if (import.meta.url === argvUrl) {
|
|
106
|
+
process.exit(main(process.argv.slice(2)));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Risk-escalation shadow report — measure before adding teeth.
|
|
3
|
+
*
|
|
4
|
+
* Walks the last N first-parent merges, classifies each one's touched paths by
|
|
5
|
+
* trust-boundary risk, and writes what *would* have escalated. Nothing is
|
|
6
|
+
* gated. Nothing fails. The output is a number whose only job is to decide
|
|
7
|
+
* whether the gate is worth building.
|
|
8
|
+
*
|
|
9
|
+
* This is the same sequencing ADR-127 used on `exec:` evidence: pre-register a
|
|
10
|
+
* threshold, measure, then decide. The threshold here — >= 5 of ~100 merges
|
|
11
|
+
* landing in a trust-boundary class — was written into
|
|
12
|
+
* `agents/roadmaps/road-to-executable-evidence.md` Phase 2 before this script
|
|
13
|
+
* was first run, so a disappointing number cannot be re-framed into a
|
|
14
|
+
* justification afterwards.
|
|
15
|
+
*
|
|
16
|
+
* Why it must not gate yet: the escalation the reference pairs this with is
|
|
17
|
+
* *non-declinable* — a user's "no" stops counting. That trades away something
|
|
18
|
+
* this package's authority model holds (`agent-authority`, `ask-when-uncertain`),
|
|
19
|
+
* and a trade that size needs evidence that the class it protects is real here,
|
|
20
|
+
* not merely real somewhere.
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* ./scripts-run src/scripts/risk_escalation_shadow
|
|
24
|
+
* ./scripts-run src/scripts/risk_escalation_shadow --limit 200
|
|
25
|
+
* ./scripts-run src/scripts/risk_escalation_shadow --json
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { spawnSync } from 'node:child_process';
|
|
29
|
+
import * as fs from 'node:fs';
|
|
30
|
+
import * as path from 'node:path';
|
|
31
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
32
|
+
|
|
33
|
+
import { classify_diff, type RiskClass } from './_lib/risk_paths.js';
|
|
34
|
+
|
|
35
|
+
const _FILE = fileURLToPath(import.meta.url);
|
|
36
|
+
const REPO = path.resolve(path.dirname(_FILE), '..', '..');
|
|
37
|
+
const OUT_REL = 'internal/reports/risk-escalation-shadow.json';
|
|
38
|
+
|
|
39
|
+
/** Pre-registered in the roadmap BEFORE this report was first read. */
|
|
40
|
+
const TEETH_THRESHOLD = 5;
|
|
41
|
+
|
|
42
|
+
interface MergeRow {
|
|
43
|
+
sha: string;
|
|
44
|
+
subject: string;
|
|
45
|
+
files: number;
|
|
46
|
+
risk: RiskClass;
|
|
47
|
+
reasons: string[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function git(args: string[]): string {
|
|
51
|
+
const r = spawnSync('git', args, { cwd: REPO, encoding: 'utf-8', maxBuffer: 64 * 1024 * 1024 });
|
|
52
|
+
if (r.status !== 0) return '';
|
|
53
|
+
return r.stdout ?? '';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function parse_limit(argv: string[]): number {
|
|
57
|
+
const i = argv.indexOf('--limit');
|
|
58
|
+
if (i === -1) return 100;
|
|
59
|
+
const n = Number(argv[i + 1]);
|
|
60
|
+
return Number.isFinite(n) && n > 0 ? n : 100;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
64
|
+
const limit = parse_limit(argv);
|
|
65
|
+
const asJson = argv.includes('--json');
|
|
66
|
+
|
|
67
|
+
const log = git(['log', '--first-parent', `-${limit}`, '--format=%H%x00%s']).trim();
|
|
68
|
+
if (!log) {
|
|
69
|
+
process.stderr.write('❌ risk_escalation_shadow: no git history readable\n');
|
|
70
|
+
return 2;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const rows: MergeRow[] = [];
|
|
74
|
+
for (const line of log.split('\n')) {
|
|
75
|
+
const [sha, subject] = line.split('\0');
|
|
76
|
+
if (!sha) continue;
|
|
77
|
+
// First-parent diff: what this merge brought to the trunk.
|
|
78
|
+
const files = git(['show', '--first-parent', '--name-only', '--format=', sha])
|
|
79
|
+
.split('\n')
|
|
80
|
+
.map((s) => s.trim())
|
|
81
|
+
.filter((s) => s.length > 0);
|
|
82
|
+
if (files.length === 0) continue;
|
|
83
|
+
const verdict = classify_diff(files);
|
|
84
|
+
rows.push({
|
|
85
|
+
sha: sha.slice(0, 9),
|
|
86
|
+
subject: (subject ?? '').slice(0, 90),
|
|
87
|
+
files: files.length,
|
|
88
|
+
risk: verdict.risk,
|
|
89
|
+
reasons: [...new Set(verdict.reasons.map((r) => r.because))],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const counts: Record<RiskClass, number> = {
|
|
94
|
+
none: 0,
|
|
95
|
+
governance: 0,
|
|
96
|
+
auth: 0,
|
|
97
|
+
'trust-boundary': 0,
|
|
98
|
+
};
|
|
99
|
+
for (const r of rows) counts[r.risk] += 1;
|
|
100
|
+
|
|
101
|
+
const trustBoundary = counts['trust-boundary'];
|
|
102
|
+
const justified = trustBoundary >= TEETH_THRESHOLD;
|
|
103
|
+
|
|
104
|
+
const report = {
|
|
105
|
+
_doc:
|
|
106
|
+
'Shadow report for trust-boundary risk escalation. NOTHING IS GATED BY THIS FILE. It answers one ' +
|
|
107
|
+
'question: over recent history, how often did a merge land in a class the reference would have ' +
|
|
108
|
+
'escalated? The threshold below was pre-registered in the roadmap before this was first read.',
|
|
109
|
+
measured_at_sha: rows[0]?.sha ?? null,
|
|
110
|
+
merges_examined: rows.length,
|
|
111
|
+
pre_registered_teeth_threshold: TEETH_THRESHOLD,
|
|
112
|
+
counts,
|
|
113
|
+
trust_boundary_merges: trustBoundary,
|
|
114
|
+
decision: justified
|
|
115
|
+
? `JUSTIFIED — ${trustBoundary} of ${rows.length} first-parent merges touched a trust-boundary path, ` +
|
|
116
|
+
`at or above the pre-registered threshold of ${TEETH_THRESHOLD}. A non-declinable escalation for ` +
|
|
117
|
+
'that class gets its own ADR and its own PR; it is deliberately NOT enabled by this report.'
|
|
118
|
+
: `NOT JUSTIFIED — ${trustBoundary} of ${rows.length} first-parent merges touched a trust-boundary ` +
|
|
119
|
+
`path, below the pre-registered threshold of ${TEETH_THRESHOLD}. The escalation stays unbuilt and ` +
|
|
120
|
+
'the authority model stays intact. This is the honest-null outcome, published as the answer.',
|
|
121
|
+
note:
|
|
122
|
+
'Classification is path-based and reproducible from the diff alone — no model judgement. Docs-only ' +
|
|
123
|
+
'changes are exempt by extension, except on kernel-rule paths, where a markdown file IS the ' +
|
|
124
|
+
'governed surface.',
|
|
125
|
+
escalating_merges: rows.filter((r) => r.risk !== 'none').slice(0, 40),
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const abs = path.join(REPO, OUT_REL);
|
|
129
|
+
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
130
|
+
fs.writeFileSync(abs, JSON.stringify(report, null, 2) + '\n');
|
|
131
|
+
|
|
132
|
+
if (asJson) {
|
|
133
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
134
|
+
return 0;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
process.stdout.write(
|
|
138
|
+
`risk-escalation shadow · ${rows.length} first-parent merges examined\n` +
|
|
139
|
+
` trust-boundary ${counts['trust-boundary']} · auth ${counts.auth} · ` +
|
|
140
|
+
`governance ${counts.governance} · none ${counts.none}\n` +
|
|
141
|
+
` pre-registered threshold: ${TEETH_THRESHOLD} → ${justified ? 'JUSTIFIED' : 'NOT JUSTIFIED'}\n` +
|
|
142
|
+
`✅ wrote ${OUT_REL}\n`,
|
|
143
|
+
);
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function _isCliEntry(): boolean {
|
|
148
|
+
const a = process.argv[1];
|
|
149
|
+
if (!a) return false;
|
|
150
|
+
if (a === _FILE || pathToFileURL(path.resolve(a)).href === import.meta.url) return true;
|
|
151
|
+
try {
|
|
152
|
+
return fs.realpathSync(a) === fs.realpathSync(_FILE);
|
|
153
|
+
} catch {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (_isCliEntry()) process.exit(main());
|
|
159
|
+
|
|
160
|
+
export { REPO, OUT_REL, TEETH_THRESHOLD };
|
|
@@ -40,6 +40,7 @@ import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
40
40
|
|
|
41
41
|
import { hardenedSpawnEnv } from "./_lib/spawn_env.js";
|
|
42
42
|
import { log_dispatch_issue } from "./hooks/dispatch_issues.js";
|
|
43
|
+
import { readHookStdin } from "./hooks/hook_stdin.js";
|
|
43
44
|
|
|
44
45
|
export const REPLAY_ENV_VAR = "AGENT_CONFIG_REPLAY";
|
|
45
46
|
|
|
@@ -458,11 +459,7 @@ function parse_args(argv: string[]): ParsedArgs {
|
|
|
458
459
|
}
|
|
459
460
|
|
|
460
461
|
function _readStdin(): string {
|
|
461
|
-
|
|
462
|
-
return fs.readFileSync(0, "utf-8");
|
|
463
|
-
} catch {
|
|
464
|
-
return "";
|
|
465
|
-
}
|
|
462
|
+
return readHookStdin();
|
|
466
463
|
}
|
|
467
464
|
|
|
468
465
|
export function main(argv?: string[]): number {
|
|
@@ -471,7 +468,13 @@ export function main(argv?: string[]): number {
|
|
|
471
468
|
return run(_readStdin(), { consumer_root: root, verbose: args.verbose });
|
|
472
469
|
}
|
|
473
470
|
|
|
471
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
472
|
+
// every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
|
|
473
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
474
474
|
function _isCliEntry(): boolean {
|
|
475
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
475
478
|
if (process.argv[1] === undefined) {
|
|
476
479
|
return false;
|
|
477
480
|
}
|
|
@@ -95,6 +95,29 @@
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
|
+
"screenshots": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"additionalProperties": true,
|
|
101
|
+
"properties": {
|
|
102
|
+
"identity_allowlist": {
|
|
103
|
+
"type": "array",
|
|
104
|
+
"items": { "type": "string" },
|
|
105
|
+
"default": [],
|
|
106
|
+
"description": "Consumed by the doc-screenshot-hygiene rule and screenshot-hygiene skill. Public identity tokens SAFE to show unredacted in a documentation screenshot — the maintainer's own public handles plus well-known fake-data tokens. Not a general fake-data dictionary and not identity-resolution: everything not listed is treated as sensitive by default, and a public handle co-located with a real name does not whitelist the real name. Default [] = nothing auto-allowed."
|
|
107
|
+
},
|
|
108
|
+
"forbid_terminal_capture": {
|
|
109
|
+
"type": "boolean",
|
|
110
|
+
"default": true,
|
|
111
|
+
"description": "Consumed by the doc-screenshot-hygiene rule. true (default) = terminal/CLI/IDE screenshots are forbidden (highest leak vector: absolute local paths, env tokens); use text code blocks with text redaction instead. false = allowed, still subject to the data-bearing human gate."
|
|
112
|
+
},
|
|
113
|
+
"data_bearing_gate": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"enum": ["on", "off"],
|
|
116
|
+
"default": "on",
|
|
117
|
+
"description": "Consumed by the doc-screenshot-hygiene rule. on (default) = a data-bearing screenshot embed is gated behind this-turn human confirmation; uncertain/unresolved regions redact-or-refuse, never ship-and-hope; illustrative/no-data screenshots may embed with a stated justification. off = no data-bearing gate (the anonymization taxonomy still applies)."
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
},
|
|
98
121
|
"code_style": {
|
|
99
122
|
"type": "object",
|
|
100
123
|
"additionalProperties": true,
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "license-policy.schema.json",
|
|
4
|
+
"title": "license-policy.yaml — derived borrow-compatibility policy",
|
|
5
|
+
"description": "Contract for the S1.2 override surface (road-to-provenance-and-license-governance). `policy.{allow,conditional,deny}` are the closed compatibility-matrix source classes; the top-level `deny` array is a flattened, concrete-SPDX-id view of `policy.deny` — it is the shape `src/scripts/lint_provenance.ts`'s `resolveDenyPolicy()` already reads directly, so this file works as its override surface without any change on that side. `derived_from: manual` marks the file as a consumer override the detector must never silently overwrite (loosening any class below the derived verdict is rejected unless this is set). Enforced by the hand-rolled Draft-07 subset validator in validate_frontmatter.ts (`validate()`/`load_schema()`) — keep to its supported keyword set: type, required, properties, additionalProperties, items, minItems, pattern, minLength, maxLength, enum. No oneOf/const/patternProperties.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["schema_version", "derived_from", "detection", "target_class", "workspace_scope", "policy", "deny", "warnings", "derived_at"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"schema_version": {
|
|
11
|
+
"type": "integer",
|
|
12
|
+
"enum": [1]
|
|
13
|
+
},
|
|
14
|
+
"derived_from": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"enum": [
|
|
17
|
+
"MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "ISC", "0BSD",
|
|
18
|
+
"MPL-2.0", "LGPL-2.1", "LGPL-3.0", "GPL-2.0", "GPL-3.0", "AGPL-3.0",
|
|
19
|
+
"SSPL-1.0", "Unlicense", "CC0-1.0",
|
|
20
|
+
"none-detected", "manual"
|
|
21
|
+
],
|
|
22
|
+
"description": "The SPDX id the policy was derived from; 'none-detected' when no license source resolved; 'manual' when a consumer authored this file directly (never auto-overwritten, and the only value allowed to loosen policy below the derived verdict)."
|
|
23
|
+
},
|
|
24
|
+
"detection": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"additionalProperties": false,
|
|
27
|
+
"required": ["source", "license_sha256"],
|
|
28
|
+
"properties": {
|
|
29
|
+
"source": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"enum": ["license-file", "package-json", "composer-json", "none", "manual"]
|
|
32
|
+
},
|
|
33
|
+
"license_sha256": {
|
|
34
|
+
"pattern": "^[a-f0-9]{64}$",
|
|
35
|
+
"description": "SHA-256 hex digest of the detected LICENSE/LICENSE.md/COPYING file content; null when no such file exists. A later change to that file's content changes this hash, which is the invalidation trigger (re-derive on mismatch, escalate on downgrade)."
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"target_class": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"enum": ["permissive", "weak-copyleft", "gpl-2.0", "gpl-3.0", "agpl", "none"]
|
|
42
|
+
},
|
|
43
|
+
"workspace_scope": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"enum": ["single", "homogeneous-multi"],
|
|
46
|
+
"description": "'single' when the repo declares no workspaces; 'homogeneous-multi' when workspaces are declared and none diverge from the root SPDX id. A divergent workspace escalates instead of writing this file at all (v1 scope-limiter — full per-workspace derivation is parked, see agents/roadmaps/later/road-to-per-workspace-license-policy.md)."
|
|
47
|
+
},
|
|
48
|
+
"policy": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"additionalProperties": false,
|
|
51
|
+
"required": ["allow", "conditional", "deny"],
|
|
52
|
+
"description": "The closed compatibility-matrix verdict, keyed by SOURCE license class (not concrete SPDX id) — this is the roadmap S1.2 matrix output. The three arrays repeat the same item schema inline (not $ref — the hand-rolled Draft-07 subset validator this file is checked against does not resolve $ref).",
|
|
53
|
+
"properties": {
|
|
54
|
+
"allow": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": { "type": "string", "enum": ["permissive", "public-domain", "weak-copyleft", "gpl-2.0", "gpl-3.0", "agpl", "sspl", "unknown"] }
|
|
57
|
+
},
|
|
58
|
+
"conditional": {
|
|
59
|
+
"type": "array",
|
|
60
|
+
"items": { "type": "string", "enum": ["permissive", "public-domain", "weak-copyleft", "gpl-2.0", "gpl-3.0", "agpl", "sspl", "unknown"] }
|
|
61
|
+
},
|
|
62
|
+
"deny": {
|
|
63
|
+
"type": "array",
|
|
64
|
+
"items": { "type": "string", "enum": ["permissive", "public-domain", "weak-copyleft", "gpl-2.0", "gpl-3.0", "agpl", "sspl", "unknown"] }
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"deny": {
|
|
69
|
+
"type": "array",
|
|
70
|
+
"items": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"enum": [
|
|
73
|
+
"MIT", "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "ISC", "0BSD",
|
|
74
|
+
"MPL-2.0", "LGPL-2.1", "LGPL-3.0", "GPL-2.0", "GPL-3.0", "AGPL-3.0",
|
|
75
|
+
"SSPL-1.0", "Unlicense", "CC0-1.0"
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"description": "Flattened concrete-SPDX-id expansion of policy.deny — the shape lint_provenance.ts's resolveDenyPolicy() reads directly (top-level `deny: [<SPDX id>, ...]`). Never hand-edit; loosening this array without derived_from: manual is rejected by the merge step."
|
|
79
|
+
},
|
|
80
|
+
"warnings": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"items": { "type": "string" }
|
|
83
|
+
},
|
|
84
|
+
"derived_at": {
|
|
85
|
+
"type": "string",
|
|
86
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "provenance-borrow.schema.json",
|
|
4
|
+
"title": "Provenance ledger borrow record",
|
|
5
|
+
"description": "One line of provenance/borrows.jsonl — a single conscious external-code borrow. Contract: provenance/README.md. Enforced by src/scripts/lint_provenance.ts (hand-rolled validator, following the ticket.schema.json / ticket-manifest.schema.json precedent — this file documents the contract; it is not loaded at runtime).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["source_url", "license", "source_sha", "borrowed_at", "files", "transformation_note", "cleared_by"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"source_url": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^(https?://\\S+|git@\\S+)$",
|
|
13
|
+
"description": "Where the borrowed code came from."
|
|
14
|
+
},
|
|
15
|
+
"license": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "SPDX identifier of the source's license, or the literal 'unknown'. 'unknown' and any deny-class SPDX id (GPL/AGPL/SSPL family, under the default conservative policy) fail the linter — an unresolved license must never land in the ledger (principle #1: unknown escalates, never down-guessed)."
|
|
18
|
+
},
|
|
19
|
+
"source_sha": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"pattern": "^[0-9a-fA-F]{7,64}$",
|
|
22
|
+
"description": "Commit or blob SHA the borrow was taken from."
|
|
23
|
+
},
|
|
24
|
+
"borrowed_at": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
27
|
+
"description": "ISO-8601 date (YYYY-MM-DD) the borrow landed."
|
|
28
|
+
},
|
|
29
|
+
"files": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"minItems": 1,
|
|
32
|
+
"items": { "type": "string" },
|
|
33
|
+
"description": "Repo-relative paths touched by the borrow. Every path must exist and must not escape the repo root."
|
|
34
|
+
},
|
|
35
|
+
"transformation_note": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"minLength": 20,
|
|
38
|
+
"description": "What structurally changed. Rename-only phrasing is rejected — per principle #6, rename-only is not transformation; clearing requires structural re-derivation (the hit disappears on rescan) or an attributed ledger entry describing an actual structural change."
|
|
39
|
+
},
|
|
40
|
+
"cleared_by": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"enum": ["rescan", "ledger", "human"],
|
|
43
|
+
"description": "How the borrow was cleared: an automated rescan found the hit gone after rewrite, this ledger entry itself is the clearance, or a human reviewed and cleared it."
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://github.com/event4u-app/agent-config/scripts/schemas/reach-channels.schema.json",
|
|
4
|
+
"x-schemaVersion": "1.0.0",
|
|
5
|
+
"title": "Reach channel registry (src/config/reach-channels.yml)",
|
|
6
|
+
"$comment": "road-to-internet-reach Phase 1. Validated by src/scripts/check_reach_channels.ts (task check-reach-channels). SCOPE: standalone operator tooling — the registry answers 'which external backend does a reach recipe need, is it healthy, is its install command pinned'. The Phase 0 benchmark returned band: stop, so no channel here is routed, recommended, or agent-facing; nothing in this schema may be read as a routing table. Lifecycle vocabulary is REUSED from docs/contracts/provider-lifecycle.md — never fork a second enum. NO $ref / patternProperties / if-then anywhere: the validator is the Draft-07 subset exported by src/scripts/validate_frontmatter.ts (type, required, properties, additionalProperties:false, items, minItems, pattern, minLength, enum), so the install-string schema is inlined per platform key on purpose. DELIBERATELY ABSENT — a per-backend readiness field (road-to-gated-reach Phase 2 step 3): a backend can pass its `--version` probe and still be unable to retrieve (`yt-dlp` needs an external JavaScript runtime it must be configured to use), and that config-semantic check is implemented DOCTOR-SIDE, keyed on the backend id, in src/scripts/reach_doctor.ts § READINESS_REQUIREMENTS. Rationale: (1) it keeps this schema honest for the backends that have no such requirement — they declare nothing, instead of each omitting an optional key a reader must interpret as an absence; (2) the requirement is a property of the upstream tool, not of an operator's registry entry, so a registry that could omit it would hand back the very false green the check closes; (3) this file is UNTRUSTED input at runtime (reach_doctor.collect() validates it before spawning anything), and a field of the form 'check this config file' would widen that input's influence into which local path the doctor reads; (4) same precedent as the doctor's DEEP_PROBES table, which is code-side for the same reason. The rejected trade-off, stated: a field here would be visible to an operator reading the registry and would let a future backend with the same need be added in YAML rather than in code — that cost is accepted, because its failure mode is only extra maintainer work, whereas the alternative's failure mode is a wrong health verdict.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"required": ["schema_version", "channels"],
|
|
10
|
+
"properties": {
|
|
11
|
+
"schema_version": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"enum": ["reach-channels-v1"],
|
|
14
|
+
"description": "Registry format version. Bumped only on a breaking shape change."
|
|
15
|
+
},
|
|
16
|
+
"channels": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"minItems": 1,
|
|
19
|
+
"description": "Channel list. A channel is a retrieval need (repository metadata, a feed, a page read); its `backends` are the ORDERED candidate tools that can satisfy it — first healthy candidate wins, so switching a backend is reordering this list, never editing code. Order carries meaning; channel order does not.",
|
|
20
|
+
"items": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"additionalProperties": false,
|
|
23
|
+
"required": ["id", "description", "tier", "lifecycle", "override_key", "last_verified", "backends"],
|
|
24
|
+
"properties": {
|
|
25
|
+
"id": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
28
|
+
"description": "Channel slug — unique within the registry, lowercase."
|
|
29
|
+
},
|
|
30
|
+
"description": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"minLength": 10,
|
|
33
|
+
"description": "What the channel retrieves, in operator terms. Never a recommendation to use it."
|
|
34
|
+
},
|
|
35
|
+
"tier": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"enum": ["zero-config", "free-key", "login"],
|
|
38
|
+
"description": "Access cost to the operator: `zero-config` = no credential; `free-key` = a free token/API key the operator provisions; `login` = an authenticated account session. Documents setup effort only — it does not authorize credential harvesting of any kind."
|
|
39
|
+
},
|
|
40
|
+
"lifecycle": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"enum": ["experimental", "stable", "deprecated", "community"],
|
|
43
|
+
"description": "Reused verbatim from docs/contracts/provider-lifecycle.md § tiers. `experimental` = shape is right, no maintainer-verified real run; `stable` = maintainer-verified against a real run at least once; `deprecated` = successor declared, kept for one migration window (see removal_after / replacement); `community` = externally contributed, best-effort."
|
|
44
|
+
},
|
|
45
|
+
"override_key": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"pattern": "^reach\\.channels\\.[a-z0-9-]+\\.backend$",
|
|
48
|
+
"description": "Settings key by which an operator pins one backend for this channel, bypassing candidate order."
|
|
49
|
+
},
|
|
50
|
+
"last_verified": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
|
|
53
|
+
"description": "ISO date the channel's backends and pins were last checked by a human. MUST be quoted in YAML — an unquoted date parses as a timestamp, not a string, and fails this type check loudly. Replaces a scheduled network CI job: staleness is checked offline against this field."
|
|
54
|
+
},
|
|
55
|
+
"removal_after": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
|
|
58
|
+
"description": "Deprecation path, optional. Only meaningful with lifecycle `deprecated`: until this date the channel still probes with a warning; past it the doctor reports the channel as removed and the staleness lint flags its continued presence in this file."
|
|
59
|
+
},
|
|
60
|
+
"replacement": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
63
|
+
"description": "Deprecation path, optional. Channel id that supersedes this one."
|
|
64
|
+
},
|
|
65
|
+
"credential_path": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"minLength": 1,
|
|
68
|
+
"pattern": "^[^\\n]+$",
|
|
69
|
+
"description": "Optional path to the credential file this channel's backend reads (`~` is expanded). The doctor ONLY stats it, to warn when it is group- or world-readable — it never opens it, never hashes it, and never reports its contents. Declared here because reach_doctor.ts enforces this schema at runtime and additionalProperties is false, so a field the code supports must be declared or no registry could use it. No shipped channel declares one."
|
|
70
|
+
},
|
|
71
|
+
"backends": {
|
|
72
|
+
"type": "array",
|
|
73
|
+
"minItems": 1,
|
|
74
|
+
"description": "Ordered candidate tools. Each is an alternative that satisfies the channel on its own — not a pipeline stage.",
|
|
75
|
+
"items": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"additionalProperties": false,
|
|
78
|
+
"required": ["id", "probe_cmd", "probe_args", "install"],
|
|
79
|
+
"properties": {
|
|
80
|
+
"id": {
|
|
81
|
+
"type": "string",
|
|
82
|
+
"pattern": "^[a-z][a-z0-9_.-]*$",
|
|
83
|
+
"description": "Backend slug — unique within its channel."
|
|
84
|
+
},
|
|
85
|
+
"probe_cmd": {
|
|
86
|
+
"type": "string",
|
|
87
|
+
"pattern": "^[a-z][a-z0-9_.-]*$",
|
|
88
|
+
"description": "Bare executable name resolved on PATH. No path separators, no shell — the probe layer spawns it directly through hardenedSpawnEnv(). MUST equal this backend's `id`: a backend probes its own binary and nothing else, so a report row labelled `gh` can never be the health of `/bin/sh`. The equality is a cross-field rule this Draft-07 subset cannot express, so it is asserted by check_probe_cmd_binding() in src/scripts/check_reach_channels.ts and reported as rule `probe_cmd-binding`."
|
|
89
|
+
},
|
|
90
|
+
"probe_args": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"minItems": 1,
|
|
93
|
+
"description": "Side-effect-free probe arguments only — a version / help / status query. The item pattern is an ALLOWLIST, not a denylist: an argument must be flag-shaped (`--version`, `-V`, `version`, `rate_limit`) and nothing else. A denylist was tried first and leaked — it admitted `cp`, `cat`, `-c`, `--data-binary` and every URL, so `probe_cmd: sh` + `probe_args: [\"-c\", \"<payload>\"]` passed the gate. What is actually true after the allowlist plus the probe_cmd===id binding plus runtime enforcement of this schema in reach_doctor.collect(): no path, no URL, no shell metacharacter, and no `-c`-style inline payload can reach the spawned child, and the child is the backend's own binary. This bounds the argument shape; it is not a proof that every upstream binary is side-effect-free under every flag — that judgement stays with the human who adds the backend.",
|
|
94
|
+
"items": {
|
|
95
|
+
"type": "string",
|
|
96
|
+
"pattern": "^-{0,2}[A-Za-z][A-Za-z0-9._-]*$"
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"install": {
|
|
100
|
+
"type": "object",
|
|
101
|
+
"additionalProperties": false,
|
|
102
|
+
"required": ["default"],
|
|
103
|
+
"description": "Human-performed install prescription per platform, selected by process.platform with `default` as the fallback. The package NEVER runs these: prescription-first, no auto-install, no piped remote installer. Platform keys are optional; `default` is not.",
|
|
104
|
+
"properties": {
|
|
105
|
+
"darwin": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"pattern": "^(?!.*(?:\\blatest\\b|\\bmain\\b|\\bmaster\\b|\\bHEAD\\b|archive/|\\.zip|\\.tgz|\\.tar\\.gz|\\.tar\\.xz))(?:os-baseline: [^\\n]{10,}|(?=.*(?:(?:==|@|=)v?[0-9]+(?:\\.[0-9]+)*|--version[ =]v?[0-9]+(?:\\.[0-9]+)*|\\sv?[0-9]+\\.[0-9]+\\.[0-9]+))[^\\n]+)$",
|
|
108
|
+
"description": "See `default` for the pinning contract."
|
|
109
|
+
},
|
|
110
|
+
"linux": {
|
|
111
|
+
"type": "string",
|
|
112
|
+
"pattern": "^(?!.*(?:\\blatest\\b|\\bmain\\b|\\bmaster\\b|\\bHEAD\\b|archive/|\\.zip|\\.tgz|\\.tar\\.gz|\\.tar\\.xz))(?:os-baseline: [^\\n]{10,}|(?=.*(?:(?:==|@|=)v?[0-9]+(?:\\.[0-9]+)*|--version[ =]v?[0-9]+(?:\\.[0-9]+)*|\\sv?[0-9]+\\.[0-9]+\\.[0-9]+))[^\\n]+)$",
|
|
113
|
+
"description": "See `default` for the pinning contract."
|
|
114
|
+
},
|
|
115
|
+
"win32": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"pattern": "^(?!.*(?:\\blatest\\b|\\bmain\\b|\\bmaster\\b|\\bHEAD\\b|archive/|\\.zip|\\.tgz|\\.tar\\.gz|\\.tar\\.xz))(?:os-baseline: [^\\n]{10,}|(?=.*(?:(?:==|@|=)v?[0-9]+(?:\\.[0-9]+)*|--version[ =]v?[0-9]+(?:\\.[0-9]+)*|\\sv?[0-9]+\\.[0-9]+\\.[0-9]+))[^\\n]+)$",
|
|
118
|
+
"description": "See `default` for the pinning contract."
|
|
119
|
+
},
|
|
120
|
+
"default": {
|
|
121
|
+
"type": "string",
|
|
122
|
+
"pattern": "^(?!.*(?:\\blatest\\b|\\bmain\\b|\\bmaster\\b|\\bHEAD\\b|archive/|\\.zip|\\.tgz|\\.tar\\.gz|\\.tar\\.xz))(?:os-baseline: [^\\n]{10,}|(?=.*(?:(?:==|@|=)v?[0-9]+(?:\\.[0-9]+)*|--version[ =]v?[0-9]+(?:\\.[0-9]+)*|\\sv?[0-9]+\\.[0-9]+\\.[0-9]+))[^\\n]+)$",
|
|
123
|
+
"description": "PINNING CONTRACT — an install prescription is EITHER (a) a command carrying an explicit version specifier (`name==1.2.3`, `name@22`, `--version 2.96.0`, or a whitespace-separated exact `1.2.3` triple), OR (b) an `os-baseline: <explanation>` sentinel for a tool the platform ships and no package install is prescribed for. Everything else FAILS: an unpinned command, and any moving-target source — `latest`, `main`, `master`, `HEAD`, `archive/…`, `.zip`, `.tgz`, `.tar.gz`, `.tar.xz`. This mechanizes the supply-chain intake floor (verify, pin, lock, never pipe a remote script to a shell) instead of asserting it."
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|