@event4u/agent-config 16.1.0 → 16.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +98 -257
- package/README.md +14 -12
- package/dist/agent-src/commands/analyze/inbox.md +1 -1
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +1 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +5 -5
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/commands/work.md +4 -0
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -0
- package/dist/agent-src/rules/broken-access-control.md +1 -0
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
- package/dist/agent-src/rules/context-hygiene.md +1 -1
- package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
- package/dist/agent-src/rules/design-fidelity.md +13 -16
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/domain-safety-retention.md +1 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
- package/dist/agent-src/rules/finance-safety-floor.md +1 -0
- package/dist/agent-src/rules/git-history-discipline.md +1 -0
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
- package/dist/agent-src/rules/legal-safety-floor.md +3 -2
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
- package/dist/agent-src/rules/media-governance-routing.md +14 -17
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
- package/dist/agent-src/rules/question-not-instruction.md +1 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
- package/dist/agent-src/rules/session-canary.md +8 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
- package/dist/agent-src/rules/source-confidentiality.md +1 -0
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
- package/dist/agent-src/rules/tool-safety.md +1 -0
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/design-review/SKILL.md +30 -4
- package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
- package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +30 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/dist/cli/python/knowledge_ingest.js +1 -1
- package/dist/cli/python/workspace_drive.js +1 -1
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
- package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
- package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
- package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
- package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
- package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
- package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +1862 -809
- package/dist/cli-delegate/cmd_doctor.js +13 -6
- package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
- package/dist/cli-delegate/cmd_explain.js +5 -5
- package/dist/cli-delegate/cmd_export.js +11 -8
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_handoff.js +10 -7
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -3
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +11 -8
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +8 -6
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +4 -3
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +11 -8
- package/dist/cli-delegate/cmd_uninstall.js +11 -8
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +11 -8
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +5 -5
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +132 -80
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +7 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/hooks/dispatch.js +7972 -5186
- package/dist/hooks/dispatch.sha256 +1 -0
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2226 -1055
- package/dist/install/installThinLayer.js +261 -0
- package/dist/install/installedRuleLinks.js +176 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +40913 -34865
- package/dist/scripts/_lib/agent_settings.js +11 -0
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/installed_layer.js +378 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/thin_rules.js +458 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/schemas/settings.js +29 -0
- package/dist/shared/skillRanking.js +74 -13
- package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
- package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/contracts/settings-classes.md +10 -6
- package/package.json +4 -4
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/src/config/agent-settings.template.yml +91 -22
- package/src/config/ci-local-parity.yml +18 -0
- package/src/config/continuity-surface.json +9 -2
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +327 -3
- package/src/config/gate-violation-baselines.json +21 -9
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-latency-budget.json +21 -0
- package/src/config/hook-token-budget.json +8 -3
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/metric-registry.yml +114 -0
- package/src/config/placeholder-drift-budget.json +10 -0
- package/src/config/routing-coverage-seed.json +38 -3
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +99 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +312 -0
- package/src/install/installedRuleLinks.ts +220 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_doctor.ts +28 -90
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
- package/src/scripts/_cli/doctor_execution.ts +100 -17
- package/src/scripts/_cli/doctor_network_posture.ts +226 -0
- package/src/scripts/_dispatch.bash +16 -2
- package/src/scripts/_lib/agent_settings.ts +11 -0
- package/src/scripts/_lib/body_portable.ts +102 -0
- package/src/scripts/_lib/cc_transcript.ts +132 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/concern_sla_window.ts +200 -0
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/forge_protection.ts +114 -0
- package/src/scripts/_lib/forge_reader.ts +558 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
- package/src/scripts/_lib/graph_feeder_record.ts +214 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_env_write.ts +111 -0
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +538 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
- package/src/scripts/_lib/obligations.ts +119 -8
- package/src/scripts/_lib/probe_inputs.ts +271 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/read_surface_scan.ts +322 -0
- package/src/scripts/_lib/release_highlights.ts +2 -1
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/shell_write_shapes.ts +108 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structural_hiding.ts +622 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/thin_rules.ts +540 -0
- package/src/scripts/_lib/touched_file_quality.ts +434 -0
- package/src/scripts/_lib/turn_end_refusals.ts +600 -4
- package/src/scripts/_lib/turn_end_transcript.ts +216 -0
- package/src/scripts/_lib/verification_command.ts +324 -0
- package/src/scripts/_lib/verification_evidence.ts +647 -0
- package/src/scripts/_lib/verify_clause.ts +280 -0
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +1 -1
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/ai_team/team_dispatch.ts +4 -0
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/before_complete_hook.ts +573 -25
- package/src/scripts/bench_hook_latency.ts +412 -5
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/cache_realization_report.ts +61 -1
- package/src/scripts/check_argument_hint.ts +287 -0
- package/src/scripts/check_claims.ts +125 -1
- package/src/scripts/check_enforcement_coverage.ts +38 -9
- package/src/scripts/check_enforcement_matrix.ts +621 -22
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_finding_dispositions.ts +138 -7
- package/src/scripts/check_generator_sync.ts +71 -0
- package/src/scripts/check_hook_bundle_composition.ts +370 -0
- package/src/scripts/check_host_docs_digest.ts +786 -0
- package/src/scripts/check_host_format_column.ts +559 -0
- package/src/scripts/check_input_references.ts +228 -0
- package/src/scripts/check_inputs_parity.ts +235 -0
- package/src/scripts/check_kernel_edit_ratified.ts +89 -9
- package/src/scripts/check_kill_switch_table.ts +294 -0
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_placeholder_drift.ts +221 -0
- package/src/scripts/check_read_surface_coverage.ts +515 -0
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_holds.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_routing_coverage.ts +378 -11
- package/src/scripts/check_standing_rule_delivery.ts +33 -13
- package/src/scripts/check_static_parity.ts +17 -0
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +145 -19
- package/src/scripts/closure_scan.ts +115 -1
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/compile_hook_manifest.ts +90 -14
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/external_sources_denylist.json +29 -4
- package/src/scripts/generate_host_cost_table.ts +1 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +192 -14
- package/src/scripts/hooks/block_config_weakening.ts +294 -4
- package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
- package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
- package/src/scripts/hooks/bundle_integrity.ts +291 -0
- package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
- package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
- package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/concern_timings.ts +94 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
- package/src/scripts/hooks/design_pass_hook.ts +100 -9
- package/src/scripts/hooks/design_slop_hook.ts +1 -2
- package/src/scripts/hooks/dispatch_hook.ts +77 -71
- package/src/scripts/hooks/edit_shape_hook.ts +1 -2
- package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
- package/src/scripts/hooks/evidence_independence.ts +1 -2
- package/src/scripts/hooks/exit_codes.ts +129 -0
- package/src/scripts/hooks/host_lowering.json +1 -0
- package/src/scripts/hooks/host_lowering.ts +146 -3
- package/src/scripts/hooks/host_lowering.yaml +262 -46
- package/src/scripts/hooks/host_semantics.ts +30 -2
- package/src/scripts/hooks/injection_budget.ts +9 -2
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
- package/src/scripts/hooks/journal_record_hook.ts +1 -2
- package/src/scripts/hooks/memory_recall_hook.ts +1 -2
- package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
- package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
- package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/permission_gate.ts +1 -2
- package/src/scripts/hooks/push_settle_hook.ts +1 -3
- package/src/scripts/hooks/replay_hook.ts +2 -1
- package/src/scripts/hooks/reread_guard_hook.ts +1 -2
- package/src/scripts/hooks/review_baseline_hook.ts +1 -2
- package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
- package/src/scripts/hooks/rule_inject_hook.ts +765 -68
- package/src/scripts/hooks/run_continuation_hook.ts +13 -15
- package/src/scripts/hooks/skill_route_hook.ts +1 -2
- package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
- package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
- package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
- package/src/scripts/hooks/table_fingerprint.ts +70 -0
- package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
- package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
- package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
- package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
- package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install.ts +75 -189
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_deny_text.ts +419 -0
- package/src/scripts/lint_exit_codes.ts +262 -0
- package/src/scripts/lint_hook_manifest.ts +108 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +63 -5
- package/src/scripts/lint_roadmap_blockers.ts +78 -12
- package/src/scripts/lint_rule_law_section.ts +517 -0
- package/src/scripts/lint_skill_descriptions.ts +1 -1
- package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
- package/src/scripts/lint_workflow_security.ts +161 -5
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/mcp_server/prompts.ts +142 -1
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
- package/src/scripts/measure_turn_end_gate.ts +193 -0
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/memory_lookup.ts +1 -1
- package/src/scripts/model_rule_injection.ts +52 -5
- package/src/scripts/prepack-check.mjs +53 -0
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/release_publication.ts +13 -1
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +157 -0
- package/src/scripts/report_invocation_surface.ts +383 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_obligation_carriers.ts +699 -0
- package/src/scripts/report_obligation_mechanism.ts +230 -0
- package/src/scripts/report_obligation_writer_split.ts +236 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_menu_census.ts +208 -0
- package/src/scripts/report_skill_ranker_confusion.ts +442 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/roadmap_verify_share.ts +213 -0
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/command.schema.json +44 -0
- package/src/scripts/schemas/review-findings.schema.json +7 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +44 -0
- package/src/scripts/self_review_gate.ts +421 -17
- package/src/scripts/semantic_parity_census.ts +314 -0
- package/src/scripts/session_eol_report.ts +54 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
- package/src/scripts/sweep_dead_scan_roots.ts +1 -1
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/trigger_eval_grandfather.json +0 -7
- package/src/scripts/trigger_eval_rotation.ts +122 -27
- package/src/scripts/ui_conformance_probe.ts +156 -4
- package/src/scripts/update_prices.ts +85 -3
- package/src/scripts/write_bundle_digest.mjs +74 -0
- package/src/server/schemas/settings.ts +41 -0
- package/src/shared/skillRanking.ts +117 -11
- package/src/templates/consumer-settings/ONBOARDING.md +1 -0
- package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
- package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/dist/ui/assets/index-DH1xc62v.js +0 -29
- package/dist/ui/assets/index-jSfMW8_t.css +0 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `verify:` clause — one grammar, one parser, two importers.
|
|
3
|
+
*
|
|
4
|
+
* THE DEFECT THIS EXISTS TO NAME. A `verify:` clause names a command and never
|
|
5
|
+
* names what the command must produce. `verify: `cat notes.md`` is a legal,
|
|
6
|
+
* green, fully-conforming step field whose oracle cannot say no: the step gets
|
|
7
|
+
* flipped on a command that was never able to fail. Measured 2026-09-29 across
|
|
8
|
+
* the 22 active roadmaps: 230 clauses, 93 naming a command, and 6 naming an
|
|
9
|
+
* expectation — so 59.6% of clauses cannot even be RUN, and 97.4% state no
|
|
10
|
+
* oracle. The absence is the norm, not an outlier.
|
|
11
|
+
*
|
|
12
|
+
* The denominator moves with archival and is not the finding. An earlier
|
|
13
|
+
* reading the same day over 27 roadmaps gave 264 / 100 / 6; five archived in
|
|
14
|
+
* between, and the count of EXPECTATIONS did not move. That is why the ratio
|
|
15
|
+
* carries and the raw totals do not.
|
|
16
|
+
*
|
|
17
|
+
* ALL SIX predate this parser, and the split is the interesting part. Three sit
|
|
18
|
+
* in an unrelated roadmap and were written by an author nobody prompted. The
|
|
19
|
+
* other three are the verify lines of the roadmap that commissioned this work —
|
|
20
|
+
* which asserted, in the same document, that ZERO clauses carried an
|
|
21
|
+
* expectation. It was carrying three of them. This grammar therefore DOCUMENTS
|
|
22
|
+
* a form already in use; it does not introduce one, and the number here is the
|
|
23
|
+
* measured one so that it carries its producing command:
|
|
24
|
+
* `./scripts-run src/scripts/roadmap_verify_share`.
|
|
25
|
+
*
|
|
26
|
+
* THE GRAMMAR. The expectation half is OPTIONAL and attaches with the arrow
|
|
27
|
+
* `exec:` evidence already carries — not a new symbol:
|
|
28
|
+
*
|
|
29
|
+
* verify: `<cmd>` -> 0 the command must exit 0
|
|
30
|
+
* verify: `<cmd>` -> 2 … or any declared exit code
|
|
31
|
+
* verify: `<cmd>` -> /regex/ the command's output must match
|
|
32
|
+
* verify: `<cmd>` runnable, but the oracle is unstated
|
|
33
|
+
* verify: <prose> MANUAL — a human reads it
|
|
34
|
+
*
|
|
35
|
+
* Prose stays legal deliberately. Forbidding it would have silently invalidated
|
|
36
|
+
* the large majority of lines already in the tree, and a grammar change that
|
|
37
|
+
* reds every existing producer gets weakened until it finds nothing. What the
|
|
38
|
+
* three shapes buy instead is that they are TELLABLE APART, which is what lets
|
|
39
|
+
* `closure_scan` report the unfalsifiable share as a number rather than an
|
|
40
|
+
* impression.
|
|
41
|
+
*
|
|
42
|
+
* WHY ONE PARSER. Two importers read this grammar — the run-continuation hook
|
|
43
|
+
* (which names the next step and its verify line) and `closure_scan` (which
|
|
44
|
+
* reports the share that cannot fail). A second copy of the arrow regex is how
|
|
45
|
+
* those two drift, and a drifted grammar fails silently: an expectation simply
|
|
46
|
+
* stops being read and the clause reads as unstated. {@link VERIFY_ARROW_SOURCE}
|
|
47
|
+
* is exported so a duplicate is detectable by a test rather than by a bug
|
|
48
|
+
* report.
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
/** What a clause says the command must produce. */
|
|
52
|
+
export type Expectation =
|
|
53
|
+
| { readonly kind: 'exit'; readonly code: number }
|
|
54
|
+
| { readonly kind: 'regex'; readonly source: string };
|
|
55
|
+
|
|
56
|
+
export interface VerifyClause {
|
|
57
|
+
/**
|
|
58
|
+
* The command, or `null` for the prose (MANUAL) form. A clause with no
|
|
59
|
+
* command cannot be run by anything, which is precisely what makes it
|
|
60
|
+
* unfalsifiable rather than merely unstated.
|
|
61
|
+
*/
|
|
62
|
+
readonly command: string | null;
|
|
63
|
+
/** The `-> 0` / `-> /re/` half, or `null` where the clause carries none. */
|
|
64
|
+
readonly expect: Expectation | null;
|
|
65
|
+
/**
|
|
66
|
+
* The clause body, whitespace-normalised — the clause, never the step.
|
|
67
|
+
*
|
|
68
|
+
* For the prose form that is the clause's own paragraph: a detector reading
|
|
69
|
+
* this must not see text the clause did not write.
|
|
70
|
+
*/
|
|
71
|
+
readonly raw: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The expectation half, as a source string.
|
|
76
|
+
*
|
|
77
|
+
* Exported rather than kept private so the "nothing may parse the arrow a
|
|
78
|
+
* second time" test has something to compare against. Two alternatives only:
|
|
79
|
+
* a bare exit code, or a slash-delimited regex. A bare word (`-> green`) is
|
|
80
|
+
* deliberately NOT an expectation — it would read as one while deciding
|
|
81
|
+
* nothing, which is the defect wearing the fix's clothes.
|
|
82
|
+
*/
|
|
83
|
+
export const VERIFY_ARROW_SOURCE = '(?:->|→)[ \\t]*(\\d+|\\/.+\\/)[ \\t]*$';
|
|
84
|
+
|
|
85
|
+
/** The arrow alone, anchored at both ends of a clause tail. */
|
|
86
|
+
const ARROW_RE = new RegExp(`^${VERIFY_ARROW_SOURCE}`);
|
|
87
|
+
|
|
88
|
+
/** A clause body split into its command head and its trailing expectation. */
|
|
89
|
+
const TAIL_RE = new RegExp(`^(.*?)[ \\t]*${VERIFY_ARROW_SOURCE}`);
|
|
90
|
+
|
|
91
|
+
/** The annotation form. Machine-readable, so it wins when both are present. */
|
|
92
|
+
const HTML_RE = /<!--\s*verify:\s*(.*?)\s*-->/g;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The step's LAST match, not its first.
|
|
96
|
+
*
|
|
97
|
+
* A step that DISCUSSES the clause carries the token before the clause that
|
|
98
|
+
* counts — the roadmap introducing this grammar shows `verify: `<cmd>` -> 0`
|
|
99
|
+
* in its own prose, two lines above its own verify line. First-match-wins
|
|
100
|
+
* parsed the illustration and reported its expectation as the step's. The
|
|
101
|
+
* clause is written last by convention, after the prose, so last wins.
|
|
102
|
+
*/
|
|
103
|
+
function lastMatch(re: RegExp, text: string): RegExpExecArray | null {
|
|
104
|
+
re.lastIndex = 0;
|
|
105
|
+
let found: RegExpExecArray | null = null;
|
|
106
|
+
let m = re.exec(text);
|
|
107
|
+
while (m !== null) {
|
|
108
|
+
found = m;
|
|
109
|
+
if (m.index === re.lastIndex) re.lastIndex += 1;
|
|
110
|
+
m = re.exec(text);
|
|
111
|
+
}
|
|
112
|
+
return found;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* The backticked form, plus at most ONE token of expectation after it.
|
|
117
|
+
*
|
|
118
|
+
* The label is an ALTERNATION with a lookahead, not two independent optional
|
|
119
|
+
* backticks. The inherited form — ``` `?verify:`? ``` — let the parser skip the
|
|
120
|
+
* trailing backtick and use the LABEL's closing backtick to open the command,
|
|
121
|
+
* so ``` `verify:` stays legal … verify: `cmd` ``` captured the whole
|
|
122
|
+
* intervening sentence as the command. Nothing failed: a garbage command is
|
|
123
|
+
* still a string, and the hook printed it into a continuation message as the
|
|
124
|
+
* step's proof. The alternation alone did not fix it — the bare branch could
|
|
125
|
+
* start one character later and borrow the same backtick — so the bare branch
|
|
126
|
+
* carries `(?!`)`: a label followed by a backtick is the delimited form, which
|
|
127
|
+
* branch one already owns.
|
|
128
|
+
*
|
|
129
|
+
* The tail is capped at a single non-space token on purpose. A caller may hand
|
|
130
|
+
* this parser a whole step BLOCK already joined into one line, so "the rest of
|
|
131
|
+
* the line" can mean "the rest of the step" — and a step that continues after
|
|
132
|
+
* its verify clause would then push the expectation away from the end anchor
|
|
133
|
+
* and lose it silently. The cost is that a regex expectation here may not
|
|
134
|
+
* contain a space; `/[1-9]/` and `/unfalsifiable-verify/` are the shapes in
|
|
135
|
+
* use, and a space-bearing expectation loses its arrow loudly (it parses as no
|
|
136
|
+
* expectation) rather than half-matching.
|
|
137
|
+
*
|
|
138
|
+
* THE CAP IS THIS FORM'S, NOT THE GRAMMAR'S — said plainly because an earlier
|
|
139
|
+
* revision of this comment implied otherwise. The annotation form is
|
|
140
|
+
* `$`-anchored through {@link VERIFY_ARROW_SOURCE} and DOES keep `-> /a b/`;
|
|
141
|
+
* this form does not. The two agree on every space-free expectation, which is
|
|
142
|
+
* every expectation in the tree. Both directions are pinned by test, so closing
|
|
143
|
+
* the gap is a deliberate act against a failing assertion rather than a silent
|
|
144
|
+
* drift — which is the failure the WHY ONE PARSER note above exists to prevent,
|
|
145
|
+
* and it applies to this module's own two readers first.
|
|
146
|
+
*/
|
|
147
|
+
const BACKTICKED_RE = /(?:`verify:`|verify:(?!`))\s*`([^`]+)`[ \t]*((?:->|→)[ \t]*\S+)?/g;
|
|
148
|
+
|
|
149
|
+
/** Prose after the label. The MANUAL form; the body is bounded separately. */
|
|
150
|
+
const PROSE_RE = /(?:`verify:`|verify:(?!`))[ \t]*/g;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* A prose clause runs to the end of its PARAGRAPH — never to the end of the step.
|
|
154
|
+
*
|
|
155
|
+
* "To end of line" is too little: a prose clause wraps, and the quantity it
|
|
156
|
+
* asserts can sit on the wrap. The rest of the step is far too much, and that
|
|
157
|
+
* was the live defect — a step's evidence block sits under its clause, so a
|
|
158
|
+
* clause that named no number inherited every number written beneath it, and
|
|
159
|
+
* `unfalsifiable-verify` reported 46 hits on quantities no clause had written.
|
|
160
|
+
*
|
|
161
|
+
* A blank line is the boundary because that is what separates a clause from the
|
|
162
|
+
* evidence recorded under it in this tree. Input with no newlines at all — a
|
|
163
|
+
* caller that already joined the block — degrades to the whole string, which is
|
|
164
|
+
* the previous behaviour and keeps such a caller working rather than silently
|
|
165
|
+
* truncating it at a boundary that is not there.
|
|
166
|
+
*/
|
|
167
|
+
function proseBody(rest: string): string {
|
|
168
|
+
const end = rest.search(/\n[ \t]*(?:\r?\n|$)/);
|
|
169
|
+
return (end === -1 ? rest : rest.slice(0, end)).replace(/\s+/g, ' ').trim();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Build an expectation from the already-isolated arrow value. */
|
|
173
|
+
function fromValue(value: string): Expectation | null {
|
|
174
|
+
if (/^\d+$/.test(value)) return { kind: 'exit', code: Number(value) };
|
|
175
|
+
const re = /^\/(.+)\/$/.exec(value);
|
|
176
|
+
if (re === null) return null;
|
|
177
|
+
const source = re[1] as string;
|
|
178
|
+
// An expectation that cannot compile is not an oracle — it is a crash
|
|
179
|
+
// waiting for the first reader that tries to apply it.
|
|
180
|
+
try {
|
|
181
|
+
new RegExp(source);
|
|
182
|
+
} catch {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
return { kind: 'regex', source };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Parse an expectation from a clause tail such as `-> 0` or `-> /re/`.
|
|
190
|
+
*
|
|
191
|
+
* @returns `null` when the tail carries no arrow, or carries one whose value is
|
|
192
|
+
* neither an exit code nor a slash-delimited regex.
|
|
193
|
+
*/
|
|
194
|
+
export function parseExpectation(tail: string): Expectation | null {
|
|
195
|
+
const m = ARROW_RE.exec(tail.trim());
|
|
196
|
+
return m === null ? null : fromValue(m[1] as string);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Split a command-bearing body into its command and its expectation. */
|
|
200
|
+
function splitBody(body: string): { command: string; expect: Expectation | null } {
|
|
201
|
+
const m = TAIL_RE.exec(body);
|
|
202
|
+
if (m === null) return { command: body.trim(), expect: null };
|
|
203
|
+
const expect = fromValue(m[2] as string);
|
|
204
|
+
// An arrow whose value decides nothing leaves the whole body as the
|
|
205
|
+
// command, rather than silently truncating it at a `->` that was prose.
|
|
206
|
+
return expect === null ? { command: body.trim(), expect: null } : { command: (m[1] as string).trim(), expect };
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Parse the `verify:` clause carried by `stepText`.
|
|
211
|
+
*
|
|
212
|
+
* @param stepText one step block — the line plus its continuation lines, which
|
|
213
|
+
* is where the tree conventionally writes the clause.
|
|
214
|
+
* @returns the clause, or `null` when the text carries no `verify:` token.
|
|
215
|
+
*/
|
|
216
|
+
export function parseVerifyClause(stepText: string): VerifyClause | null {
|
|
217
|
+
const html = lastMatch(HTML_RE, stepText);
|
|
218
|
+
if (html !== null) {
|
|
219
|
+
const body = (html[1] as string).trim();
|
|
220
|
+
// An EMPTY annotation is not a clause and must not mask one. Returning
|
|
221
|
+
// null here — the inherited behaviour — let `<!-- verify: -->` hide a
|
|
222
|
+
// real backticked clause further along the same step, and now that two
|
|
223
|
+
// readers consume this parser it would hide it from the share too.
|
|
224
|
+
if (body !== '') {
|
|
225
|
+
const { command, expect } = splitBody(body);
|
|
226
|
+
return { command: command === '' ? null : command, expect, raw: body };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const backticked = lastMatch(BACKTICKED_RE, stepText);
|
|
231
|
+
if (backticked !== null) {
|
|
232
|
+
const command = (backticked[1] as string).trim();
|
|
233
|
+
if (command !== '') {
|
|
234
|
+
const tail = (backticked[2] ?? '').trim();
|
|
235
|
+
return { command, expect: parseExpectation(tail), raw: `\`${command}\`${tail === '' ? '' : ` ${tail}`}` };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const prose = lastMatch(PROSE_RE, stepText);
|
|
240
|
+
if (prose === null) return null;
|
|
241
|
+
const body = proseBody(stepText.slice(prose.index + prose[0].length));
|
|
242
|
+
if (body === '') return null;
|
|
243
|
+
return { command: null, expect: null, raw: body };
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* The clause's command half only — `null` where the clause is prose or absent.
|
|
248
|
+
*
|
|
249
|
+
* The narrowing the run-continuation hook wants: it renders a command for the
|
|
250
|
+
* next step, and a prose clause is not one. Kept here rather than at the call
|
|
251
|
+
* site so the hook imports a decision rather than re-deriving it.
|
|
252
|
+
*/
|
|
253
|
+
export function commandBearing(stepText: string): VerifyClause | null {
|
|
254
|
+
const clause = parseVerifyClause(stepText);
|
|
255
|
+
if (clause === null || clause.command === null) return null;
|
|
256
|
+
return clause;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Render an expectation back to its written form, for messages and evidence. */
|
|
260
|
+
export function formatExpectation(expect: Expectation): string {
|
|
261
|
+
return expect.kind === 'exit' ? `-> ${String(expect.code)}` : `-> /${expect.source}/`;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* The clause as a continuation-message line, empty when there is nothing to say.
|
|
266
|
+
*
|
|
267
|
+
* The expectation rides along with the command, and that is the point rather
|
|
268
|
+
* than a formatting nicety: a re-engagement told only the command can run it,
|
|
269
|
+
* see exit 0, and flip the box regardless — the whole defect the arrow exists
|
|
270
|
+
* to close. Told the expectation too, it has an oracle.
|
|
271
|
+
*
|
|
272
|
+
* Lives beside the grammar rather than at the one call site so that one module
|
|
273
|
+
* owns how a clause is read AND how it is written back, which is also what
|
|
274
|
+
* keeps the over-cap hook from paying these lines.
|
|
275
|
+
*/
|
|
276
|
+
export function renderVerifyLine(clause: VerifyClause | null): string {
|
|
277
|
+
if (clause === null) return '';
|
|
278
|
+
const expect = clause.expect === null ? '' : ` ${formatExpectation(clause.expect)}`;
|
|
279
|
+
return `\n verify: ${clause.command ?? ''}${expect}`;
|
|
280
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The windsurf single-file surface, rendered — one renderer, two callers.
|
|
3
|
+
*
|
|
4
|
+
* `road-to-a-hook-bundle-with-one-yaml-reader` 3.1. `condense.generate_windsurfrules`
|
|
5
|
+
* WRITES `.windsurfrules`; the standing-payload census needs the same bytes to
|
|
6
|
+
* report windsurf's figure without reading that file, because it is an untracked
|
|
7
|
+
* generated projection and reading it published a number that tracked when the
|
|
8
|
+
* checkout last ran `task generate-tools` rather than anything about the tree.
|
|
9
|
+
*
|
|
10
|
+
* Both callers share THIS function. A second renderer living in the census would
|
|
11
|
+
* have measured a file nobody receives, which is Risk 3 of that roadmap.
|
|
12
|
+
*
|
|
13
|
+
* WHY A SEPARATE MODULE rather than an export from `condense.ts`: that file sits
|
|
14
|
+
* 1,228 lines over the 1,500-line cap `check_source_size_budget` ratchets, so
|
|
15
|
+
* every line added there is a new violation. Splitting the renderer out moves
|
|
16
|
+
* `condense.ts` DOWN. The file is small on purpose and carries only what the
|
|
17
|
+
* render needs.
|
|
18
|
+
*
|
|
19
|
+
* `strip_frontmatter` moved here with it — it is the render's one non-trivial
|
|
20
|
+
* dependency, it has exactly one caller left inside `condense.ts`, and leaving it
|
|
21
|
+
* behind would have meant either an import cycle or a second copy.
|
|
22
|
+
* `condense.ts` re-exports it, so `src/install/emit_host_rules_cli.ts` and every
|
|
23
|
+
* other importer keeps its path.
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from 'node:fs';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
|
|
28
|
+
/** Python `str.lstrip("\n")` — strip only leading newlines. Mirrors `condense._lstripNewlines`. */
|
|
29
|
+
function lstripNewlines(s: string): string {
|
|
30
|
+
return s.replace(/^\n+/, '');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Python `str.strip()` with no args — strip leading/trailing Unicode whitespace. Mirrors `condense._strip`. */
|
|
34
|
+
function strip(s: string): string {
|
|
35
|
+
return s.replace(/^\s+/u, '').replace(/\s+$/u, '');
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Drop a leading `---` frontmatter block, if the content opens with one. */
|
|
39
|
+
export function strip_frontmatter(content: string): string {
|
|
40
|
+
if (content.startsWith('---')) {
|
|
41
|
+
const end = content.indexOf('---', 3);
|
|
42
|
+
if (end !== -1) {
|
|
43
|
+
content = lstripNewlines(content.slice(end + 3));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return content;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The exact bytes `generate_windsurfrules` writes, for a given rule set.
|
|
51
|
+
*
|
|
52
|
+
* `rulesSource` is a parameter rather than `condense.MODULE_STATE.RULES_SOURCE`
|
|
53
|
+
* so a caller can render a tree it names — the census renders the projection
|
|
54
|
+
* source directly, with no module state to set up.
|
|
55
|
+
*/
|
|
56
|
+
export function render_windsurfrules(rulesSource: string, rules: readonly string[]): string {
|
|
57
|
+
const parts = ['# Auto-generated from dist/agent-src/rules/ — do not edit directly\n'];
|
|
58
|
+
for (const rule of rules) {
|
|
59
|
+
const content = strip_frontmatter(fs.readFileSync(path.join(rulesSource, rule), 'utf-8'));
|
|
60
|
+
parts.push(`---\n\n${strip(content)}\n`);
|
|
61
|
+
}
|
|
62
|
+
return parts.join('\n') + '\n';
|
|
63
|
+
}
|
|
@@ -29,15 +29,23 @@ import * as path from 'node:path';
|
|
|
29
29
|
export const CLI_CALLS_ATTRIBUTION_SUFFIX = '.attribution.json';
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
* Who booked a call. Enumerated because the consumer set is closed: exactly
|
|
33
|
-
* files in the tree construct a `CliClient`.
|
|
32
|
+
* Who booked a call. Enumerated because the consumer set is closed: exactly
|
|
33
|
+
* three files in the tree construct a `CliClient`.
|
|
34
34
|
*
|
|
35
|
-
* `unknown` is a FINDING when it appears — it means a
|
|
36
|
-
*
|
|
37
|
-
*
|
|
35
|
+
* `unknown` is a FINDING when it appears — it means a booking path exists that
|
|
36
|
+
* this enumeration does not know about. That is how the test suite was caught
|
|
37
|
+
* spending the operator's live budget.
|
|
38
38
|
*/
|
|
39
39
|
export const CLI_CONSUMER_COUNCIL = 'council';
|
|
40
40
|
export const CLI_CONSUMER_TEAM = 'team';
|
|
41
|
+
/**
|
|
42
|
+
* The dogfooded self-review gate. Third because `self_review_gate.ts` is
|
|
43
|
+
* CLI-first since this constant was added: the subscription transport is tried
|
|
44
|
+
* before the API one, so a local or self-hosted run books here rather than
|
|
45
|
+
* spending API credit. A hosted CI runner has no vendor CLI on PATH and falls
|
|
46
|
+
* through to the API transport, which books nothing against this counter.
|
|
47
|
+
*/
|
|
48
|
+
export const CLI_CONSUMER_SELF_REVIEW = 'self-review';
|
|
41
49
|
export const CLI_CONSUMER_UNKNOWN = 'unknown';
|
|
42
50
|
|
|
43
51
|
/**
|
|
@@ -88,6 +88,7 @@ import * as user_global_paths from '../_lib/user_global_paths.js';
|
|
|
88
88
|
import { jsonDumpsIndent2 as _jsonDumpsIndent2 } from './_py_json.js';
|
|
89
89
|
import * as budget from './cli_call_budget.js';
|
|
90
90
|
import { appendEvent } from './events_log.js';
|
|
91
|
+
import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
|
|
91
92
|
|
|
92
93
|
export const ANTHROPIC_KEY_FILENAME = 'anthropic.key';
|
|
93
94
|
export const OPENAI_KEY_FILENAME = 'openai.key';
|
|
@@ -124,23 +125,12 @@ export const DEFAULT_PERPLEXITY_MODEL = 'sonar-pro';
|
|
|
124
125
|
// divergence is a one-line change, not a hunt through inline literals.
|
|
125
126
|
// (`xai` / `perplexity` CLI reuse their API constants: their CLIs are
|
|
126
127
|
// community wrappers around the same paid API, so the values do not diverge.)
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
* `400 invalid_request_error: The '<model>' model is not supported when using
|
|
134
|
-
* Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
|
|
135
|
-
* value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
|
|
136
|
-
*
|
|
137
|
-
* So the only value known to work on this transport is "whatever the CLI
|
|
138
|
-
* chooses", and pinning ANY name here would re-break the seat the next time
|
|
139
|
-
* the vendor rotates its lineup. The label is carried into records as-is so a
|
|
140
|
-
* reader can see that no model was pinned, rather than a name being implied
|
|
141
|
-
* that nobody verified.
|
|
142
|
-
*/
|
|
143
|
-
export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';
|
|
128
|
+
// `OPENAI_CLI_VENDOR_DEFAULT` lives in `vendor_defaults.ts`, re-exported here
|
|
129
|
+
// so every existing importer keeps resolving. It moved because `config.ts`
|
|
130
|
+
// wanted that one string and was charged this whole module for it in the
|
|
131
|
+
// composed hook bundle — 51,523 bytes on every dispatch; the reasoning and the
|
|
132
|
+
// measurement are in that file's header.
|
|
133
|
+
export { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
|
|
144
134
|
|
|
145
135
|
/**
|
|
146
136
|
* Models MEASURED to be refused by the codex subscription transport, with the
|
|
@@ -1011,6 +1001,7 @@ export const CLI_CALLS_FILENAME = 'cli-calls.json';
|
|
|
1011
1001
|
export {
|
|
1012
1002
|
CLI_CALLS_ATTRIBUTION_SUFFIX,
|
|
1013
1003
|
CLI_CONSUMER_COUNCIL,
|
|
1004
|
+
CLI_CONSUMER_SELF_REVIEW,
|
|
1014
1005
|
CLI_CONSUMER_TEAM,
|
|
1015
1006
|
CLI_CONSUMER_UNKNOWN,
|
|
1016
1007
|
QUOTA_SOURCE_LOCAL_BUDGET,
|
|
@@ -1678,16 +1669,22 @@ export function _foldSystemPrompt(system_prompt: string, user_prompt: string): s
|
|
|
1678
1669
|
export class AnthropicCliClient extends CliClient {
|
|
1679
1670
|
override subscription_label = 'claude-pro';
|
|
1680
1671
|
|
|
1672
|
+
// `...opts` rather than a field list, in all five CLI subclasses, and the
|
|
1673
|
+
// spread IS the fix rather than a tidy. Each of these constructors used to
|
|
1674
|
+
// name six option fields explicitly and forward those — so when
|
|
1675
|
+
// `CliClientOptions` grew a seventh, `consumer`, every subclass silently
|
|
1676
|
+
// dropped it. Both construction sites passed it, `CliClient` read
|
|
1677
|
+
// `opts.consumer ?? CLI_CONSUMER_UNKNOWN`, and the sidecar recorded
|
|
1678
|
+
// `unknown` for every CLI call ever booked: measured 2026-10-05 as
|
|
1679
|
+
// `{"anthropic":{"unknown":2},"openai":{"unknown":2}}` after a council
|
|
1680
|
+
// round. A field list can forget a field. A spread cannot, so the eighth
|
|
1681
|
+
// option needs no edit here and cannot repeat this.
|
|
1682
|
+
//
|
|
1683
|
+
// `model` stays explicit because it is the one field each subclass
|
|
1684
|
+
// overrides with its own pinned default; everything else passes through.
|
|
1681
1685
|
constructor(opts: CliClientOptions = {}) {
|
|
1682
1686
|
super(
|
|
1683
|
-
{
|
|
1684
|
-
model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL,
|
|
1685
|
-
binary: opts.binary,
|
|
1686
|
-
timeout_seconds: opts.timeout_seconds,
|
|
1687
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
1688
|
-
warn_at: opts.warn_at,
|
|
1689
|
-
cli_calls_path: opts.cli_calls_path,
|
|
1690
|
-
},
|
|
1687
|
+
{ ...opts, model: opts.model ?? DEFAULT_ANTHROPIC_CLI_MODEL },
|
|
1691
1688
|
{ name: 'anthropic', default_binary: 'claude' },
|
|
1692
1689
|
);
|
|
1693
1690
|
}
|
|
@@ -1817,14 +1814,7 @@ export class OpenAICliClient extends CliClient {
|
|
|
1817
1814
|
|
|
1818
1815
|
constructor(opts: CliClientOptions = {}) {
|
|
1819
1816
|
super(
|
|
1820
|
-
{
|
|
1821
|
-
model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL,
|
|
1822
|
-
binary: opts.binary,
|
|
1823
|
-
timeout_seconds: opts.timeout_seconds,
|
|
1824
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
1825
|
-
warn_at: opts.warn_at,
|
|
1826
|
-
cli_calls_path: opts.cli_calls_path,
|
|
1827
|
-
},
|
|
1817
|
+
{ ...opts, model: opts.model ?? DEFAULT_OPENAI_CLI_MODEL },
|
|
1828
1818
|
{ name: 'openai', default_binary: 'codex' },
|
|
1829
1819
|
);
|
|
1830
1820
|
}
|
|
@@ -2064,14 +2054,7 @@ export class GeminiCliClient extends CliClient {
|
|
|
2064
2054
|
|
|
2065
2055
|
constructor(opts: CliClientOptions = {}) {
|
|
2066
2056
|
super(
|
|
2067
|
-
{
|
|
2068
|
-
model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL,
|
|
2069
|
-
binary: opts.binary,
|
|
2070
|
-
timeout_seconds: opts.timeout_seconds,
|
|
2071
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
2072
|
-
warn_at: opts.warn_at,
|
|
2073
|
-
cli_calls_path: opts.cli_calls_path,
|
|
2074
|
-
},
|
|
2057
|
+
{ ...opts, model: opts.model ?? DEFAULT_GEMINI_CLI_MODEL },
|
|
2075
2058
|
{ name: 'gemini', default_binary: 'gemini' },
|
|
2076
2059
|
);
|
|
2077
2060
|
}
|
|
@@ -2217,14 +2200,7 @@ export class XAICliClient extends CliClient {
|
|
|
2217
2200
|
|
|
2218
2201
|
constructor(opts: CliClientOptions = {}) {
|
|
2219
2202
|
super(
|
|
2220
|
-
{
|
|
2221
|
-
model: opts.model ?? DEFAULT_XAI_MODEL,
|
|
2222
|
-
binary: opts.binary,
|
|
2223
|
-
timeout_seconds: opts.timeout_seconds,
|
|
2224
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
2225
|
-
warn_at: opts.warn_at,
|
|
2226
|
-
cli_calls_path: opts.cli_calls_path,
|
|
2227
|
-
},
|
|
2203
|
+
{ ...opts, model: opts.model ?? DEFAULT_XAI_MODEL },
|
|
2228
2204
|
{ name: 'xai', default_binary: 'grok' },
|
|
2229
2205
|
);
|
|
2230
2206
|
}
|
|
@@ -2289,14 +2265,7 @@ export class PerplexityCliClient extends CliClient {
|
|
|
2289
2265
|
|
|
2290
2266
|
constructor(opts: CliClientOptions = {}) {
|
|
2291
2267
|
super(
|
|
2292
|
-
{
|
|
2293
|
-
model: opts.model ?? DEFAULT_PERPLEXITY_MODEL,
|
|
2294
|
-
binary: opts.binary,
|
|
2295
|
-
timeout_seconds: opts.timeout_seconds,
|
|
2296
|
-
max_calls_per_day: opts.max_calls_per_day,
|
|
2297
|
-
warn_at: opts.warn_at,
|
|
2298
|
-
cli_calls_path: opts.cli_calls_path,
|
|
2299
|
-
},
|
|
2268
|
+
{ ...opts, model: opts.model ?? DEFAULT_PERPLEXITY_MODEL },
|
|
2300
2269
|
{ name: 'perplexity', default_binary: 'perplexity' },
|
|
2301
2270
|
);
|
|
2302
2271
|
}
|
|
@@ -82,7 +82,7 @@ import * as budget from './cli_call_budget.js';
|
|
|
82
82
|
// `import type` and is erased at build, so there is no runtime cycle today.
|
|
83
83
|
// Converting it to a value import — or adding any other runtime import from
|
|
84
84
|
// quorum into config — creates a real ESM cycle in the loader's init path.
|
|
85
|
-
import { OPENAI_CLI_VENDOR_DEFAULT } from './
|
|
85
|
+
import { OPENAI_CLI_VENDOR_DEFAULT } from './vendor_defaults.js';
|
|
86
86
|
import { parseSeatFields, type PolicyExclusion } from './seat_policy.js';
|
|
87
87
|
import type { ContentClass } from './content_ceiling.js';
|
|
88
88
|
import { SOLO_FLOOR_MIN_PRESENT } from './quorum.js';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendor-CLI sentinel values that are DATA, carried in a module with no
|
|
3
|
+
* dependencies of its own.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS FILE EXISTS, measured rather than argued. `OPENAI_CLI_VENDOR_DEFAULT`
|
|
6
|
+
* is a single string, and it used to live in `clients.ts` beside the transport
|
|
7
|
+
* classes that compare against it. `ai_council/config.ts` imports that one
|
|
8
|
+
* string and nothing else from `clients.ts`; `config.ts` is reachable from
|
|
9
|
+
* `council-availability`, which is bound on `session_start`. So every hook
|
|
10
|
+
* dispatch on every slot carried the whole council transport layer —
|
|
11
|
+
* `clients.ts` and its closure, **51,523 bytes** of the composed
|
|
12
|
+
* `dist/hooks/dispatch.js` — to compare one string against another. Breaking
|
|
13
|
+
* that one import edge removes exactly that, with no capability removed
|
|
14
|
+
* anywhere: every entry point that actually talks to a vendor CLI imports
|
|
15
|
+
* `clients.ts` directly and still does.
|
|
16
|
+
*
|
|
17
|
+
* The bytes are not an abstraction. `src/config/hook-bundle-budget.json` caps
|
|
18
|
+
* the composed bundle, the cap is a shrink-only ratchet, and on 2026-10-02 the
|
|
19
|
+
* tree stood 75 bytes under it — a state in which no concern anywhere could add
|
|
20
|
+
* a line. This module is how `road-to-a-rule-carrier-that-works-outside-the-repo`
|
|
21
|
+
* Phase 1 paid for its own runtime code instead of asking for a raise.
|
|
22
|
+
*
|
|
23
|
+
* WHAT BELONGS HERE: a vendor-facing constant that a CONFIGURATION reader needs
|
|
24
|
+
* and a TRANSPORT reader also happens to use. Nothing that imports anything.
|
|
25
|
+
* The moment this file gains an import it stops being the cheap half of the
|
|
26
|
+
* split and the split stops being worth its own file.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Sentinel: let the codex CLI pick its own model, by omitting `--model`.
|
|
31
|
+
*
|
|
32
|
+
* This is not a placeholder for a value nobody looked up. Measured
|
|
33
|
+
* 2026-08-15 against `codex exec --json` on a ChatGPT-account (subscription)
|
|
34
|
+
* transport, every explicitly named candidate was refused with
|
|
35
|
+
* `400 invalid_request_error: The '<model>' model is not supported when using
|
|
36
|
+
* Codex with a ChatGPT account.` — `gpt-4o`, `gpt-5` (this constant's previous
|
|
37
|
+
* value) and `gpt-5.1-codex` alike. Omitting the flag answered normally.
|
|
38
|
+
*
|
|
39
|
+
* So the only value known to work on this transport is "whatever the CLI
|
|
40
|
+
* chooses", and pinning ANY name here would re-break the seat the next time
|
|
41
|
+
* the vendor rotates its lineup. The label is carried into records as-is so a
|
|
42
|
+
* reader can see that no model was pinned, rather than a name being implied
|
|
43
|
+
* that nobody verified.
|
|
44
|
+
*/
|
|
45
|
+
export const OPENAI_CLI_VENDOR_DEFAULT = 'codex-default';
|
|
@@ -37,6 +37,10 @@
|
|
|
37
37
|
* shape of an Apache-2.0 upstream — attribution in the repo-root NOTICE file.
|
|
38
38
|
*/
|
|
39
39
|
import { spawnSync } from 'node:child_process';
|
|
40
|
+
// read-surface: inter-agent-reply — a teammate's reply arrives through a HOST
|
|
41
|
+
// primitive this package does not own, so no call site here spells the inbound
|
|
42
|
+
// fetch. Declared rather than inferred; the coverage verdict is still read from
|
|
43
|
+
// the import below.
|
|
40
44
|
import { sanitize_text } from '../_lib/retrieval_sanitize.js';
|
|
41
45
|
import * as fs from 'node:fs';
|
|
42
46
|
import * as path from 'node:path';
|