@event4u/agent-config 16.0.0 → 16.2.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 +289 -140
- package/CONTRIBUTING.md +9 -0
- package/README.md +2 -2
- package/dist/agent-src/commands/analyze/inbox.md +26 -0
- package/dist/agent-src/commands/analyze/roadmap-repos.md +27 -0
- package/dist/agent-src/commands/challenge-me/closure.md +178 -0
- package/dist/agent-src/commands/challenge-me.md +9 -2
- package/dist/agent-src/commands/council/default.md +25 -5
- package/dist/agent-src/commands/feature/plan.md +28 -1
- package/dist/agent-src/commands/feature/roadmap.md +28 -1
- package/dist/agent-src/commands/implement-ticket.md +27 -0
- package/dist/agent-src/commands/jira-ticket.md +27 -0
- package/dist/agent-src/commands/pr/create.md +29 -0
- package/dist/agent-src/commands/pr/merge.md +60 -9
- package/dist/agent-src/commands/roadmap/ai-council.md +7 -1
- package/dist/agent-src/commands/roadmap/create.md +74 -27
- package/dist/agent-src/commands/roadmap/materialize.md +27 -0
- package/dist/agent-src/commands/roadmap/process-full.md +123 -18
- package/dist/agent-src/commands/team.md +22 -0
- package/dist/agent-src/commands/work.md +4 -0
- package/dist/agent-src/contexts/authority/scope-growth-ownership.md +80 -0
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +47 -0
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +44 -3
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +19 -23
- package/dist/agent-src/contexts/execution/decision-closure-execution.md +93 -0
- package/dist/agent-src/contexts/execution/fix-loop-ladder.md +108 -0
- package/dist/agent-src/contexts/execution/plan-confidence-gate.md +4 -2
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +75 -6
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/dist/agent-src/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/dist/agent-src/guidelines/design-fidelity-routing.md +29 -0
- package/dist/agent-src/rules/autonomous-execution.md +15 -8
- package/dist/agent-src/rules/delegation-policy.md +23 -45
- package/dist/agent-src/rules/design-fidelity.md +32 -37
- package/dist/agent-src/rules/evaluator-independence.md +43 -49
- package/dist/agent-src/rules/test-first.md +41 -0
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- package/dist/agent-src/skills/ai-council/SKILL.md +11 -3
- package/dist/agent-src/skills/api-design/data/manifest.json +3 -3
- package/dist/agent-src/skills/database/data/manifest.json +4 -4
- package/dist/agent-src/skills/database/data/query-tuning.csv +3 -3
- package/dist/agent-src/skills/design-review/SKILL.md +80 -4
- package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +30 -5
- package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
- package/dist/agent-src/skills/experiment-loop/SKILL.md +31 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
- package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +42 -3
- package/dist/agent-src/skills/threat-modeling/SKILL.md +9 -4
- package/dist/agent-src/skills/threat-modeling/data/manifest.json +4 -4
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +23 -0
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +37 -3
- package/dist/agent-src/templates/agent-settings.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +218 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -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 +260 -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/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-delegate/check_update_banner.js +40 -2
- package/dist/cli-delegate/chunk-4E2W63DA.js +335 -0
- package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-4XFP2Y3E.js} +1 -1
- package/dist/cli-delegate/chunk-5R7HOLAF.js +99 -0
- package/dist/cli-delegate/{chunk-IVBPRCQO.js → chunk-6KFEC3G7.js} +1 -1
- package/dist/cli-delegate/{chunk-2TAQ2K4V.js → chunk-6KM6ORRY.js} +55 -386
- package/dist/cli-delegate/{chunk-AK6HODNQ.js → chunk-7XGBX6ZH.js} +973 -555
- package/dist/cli-delegate/{chunk-2XY7ILBT.js → chunk-FC75PGJE.js} +42 -2
- package/dist/cli-delegate/{chunk-55ACLDUE.js → chunk-FP36SWJD.js} +587 -141
- package/dist/cli-delegate/{chunk-3FKR64R5.js → chunk-IGD6ERX6.js} +62 -7
- package/dist/cli-delegate/{chunk-GYC3VRYN.js → chunk-JNMVLWLR.js} +99 -14
- package/dist/cli-delegate/{chunk-H32DGUJH.js → chunk-P6ZHP5W2.js} +1 -1
- package/dist/cli-delegate/{chunk-57PN4GYJ.js → chunk-RGNIWTEA.js} +1 -1
- package/dist/cli-delegate/chunk-ROYYTEZU.js +39 -0
- package/dist/cli-delegate/{chunk-2DK2VJWG.js → chunk-WGXTVKCQ.js} +20 -6
- package/dist/cli-delegate/chunk-YDPILCOL.js +152 -0
- package/dist/cli-delegate/{chunk-QJWAUMJW.js → chunk-YJ72UIAK.js} +730 -15
- 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 +985 -831
- package/dist/cli-delegate/cmd_doctor.js +7 -5
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +9 -7
- package/dist/cli-delegate/cmd_fleet.js +4 -2
- package/dist/cli-delegate/cmd_handoff.js +7 -7
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_preflight.js +4 -2
- package/dist/cli-delegate/cmd_prune.js +10 -8
- package/dist/cli-delegate/cmd_route_audit.js +3 -3
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +4 -4
- package/dist/cli-delegate/cmd_settings_get.js +28 -2
- package/dist/cli-delegate/cmd_settings_migrate.js +9 -7
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -8
- package/dist/cli-delegate/cmd_uninstall.js +16 -13
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +12 -10
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +90 -43
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +10 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +8 -6
- package/dist/hooks/dispatch.js +7682 -2772
- package/dist/hooks/dispatch.sha256 +1 -0
- package/dist/install/claudeRuleRewrite.js +14 -3
- package/dist/install/conflict.js +60 -10
- package/dist/install/conflictTracker.js +218 -0
- package/dist/install/fsPrimitives.js +54 -0
- package/dist/install/install.mjs +2200 -1559
- package/dist/install/manifestFiles.js +259 -0
- package/dist/install/preflight.js +14 -2
- package/dist/install/preserve.js +157 -0
- package/dist/install/recordedOwnership.js +132 -0
- package/dist/install/txlog.js +11 -2
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +3066 -1470
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +3 -2
- package/dist/scripts/_lib/fs_atomic.js +167 -0
- package/dist/scripts/_lib/installed_tools.js +460 -0
- package/dist/scripts/_lib/lean_projection_mode.js +3 -2
- package/dist/scripts/_lib/settings_renamed_keys.js +78 -0
- package/dist/server/routes/install.js +8 -0
- package/dist/server/routes/wizard.js +9 -3
- package/dist/server/schemas/settings.js +40 -5
- package/dist/shared/missionExecution.js +97 -0
- 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/MIGRATION.md +103 -0
- package/docs/contracts/settings-classes.md +28 -7
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +57 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +102 -0
- package/docs/guidelines/design-fidelity-routing.md +29 -0
- package/package.json +4 -4
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +62 -2
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +1 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +1 -0
- 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 +260 -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/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 +168 -27
- package/src/config/auto-rule-budget.json +16 -0
- package/src/config/ci-local-parity.yml +36 -5
- package/src/config/continuity-surface.json +23 -2
- package/src/config/gate-coverage.yml +377 -13
- package/src/config/gate-violation-baselines.json +10 -6
- package/src/config/hook-latency-budget.json +21 -0
- package/src/config/hook-token-budget.json +4 -2
- package/src/config/loop-surfaces.yaml +215 -0
- package/src/config/metric-registry.yml +114 -0
- package/src/config/placeholder-drift-budget.json +10 -0
- package/src/config/platform-anchor.json +3 -2
- package/src/config/release-gate-locality.yml +11 -0
- package/src/config/routing-coverage-seed.json +33 -5
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/install/claudeRuleRewrite.ts +16 -2
- package/src/install/conflict.ts +65 -9
- package/src/install/conflictTracker.ts +299 -0
- package/src/install/fsPrimitives.ts +54 -0
- package/src/install/manifestFiles.ts +312 -0
- package/src/install/preflight.ts +16 -2
- package/src/install/preserve.ts +205 -0
- package/src/install/recordedOwnership.ts +149 -0
- package/src/install/txlog.ts +11 -2
- package/src/install/types.ts +19 -4
- package/src/scripts/_cli/cmd_conformance.ts +88 -15
- package/src/scripts/_cli/cmd_doctor.ts +7 -20
- package/src/scripts/_cli/cmd_route_explain.ts +9 -2
- package/src/scripts/_cli/cmd_settings_get.ts +44 -0
- package/src/scripts/_cli/doctor_execution.ts +173 -0
- package/src/scripts/_cli/doctor_network_posture.ts +226 -0
- package/src/scripts/_lib/activation_payload.ts +247 -0
- package/src/scripts/_lib/agent_settings.ts +4 -2
- package/src/scripts/_lib/authority_path.ts +102 -0
- package/src/scripts/_lib/body_portable.ts +102 -0
- package/src/scripts/_lib/cascade_base.ts +94 -0
- package/src/scripts/_lib/cc_transcript.ts +132 -1
- package/src/scripts/_lib/changelog_eras.ts +7 -2
- package/src/scripts/_lib/concern_sla_window.ts +200 -0
- package/src/scripts/_lib/continuation_ladder.ts +149 -2
- package/src/scripts/_lib/council_transport.ts +129 -0
- package/src/scripts/_lib/delivery_ready.ts +112 -0
- package/src/scripts/_lib/forge_protection.ts +381 -0
- package/src/scripts/_lib/forge_reader.ts +558 -0
- package/src/scripts/_lib/hook_platform_keys.ts +27 -0
- package/src/scripts/_lib/host_env_write.ts +111 -0
- package/src/scripts/_lib/json_python_parity.ts +127 -0
- package/src/scripts/_lib/lean_projection_mode.ts +14 -3
- package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
- package/src/scripts/_lib/loop_surfaces.ts +382 -0
- package/src/scripts/_lib/mission_record.ts +190 -0
- package/src/scripts/_lib/obligation_frequency.ts +217 -0
- package/src/scripts/_lib/obligations.ts +513 -0
- package/src/scripts/_lib/orchestration_record.ts +11 -20
- package/src/scripts/_lib/probe_inputs.ts +271 -0
- package/src/scripts/_lib/read_surface_scan.ts +322 -0
- package/src/scripts/_lib/release_highlights.ts +201 -11
- package/src/scripts/_lib/release_holds.ts +493 -0
- package/src/scripts/_lib/release_migration_gate.ts +184 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
- package/src/scripts/_lib/rides_along.ts +102 -0
- package/src/scripts/_lib/settings_renamed_keys.ts +82 -0
- package/src/scripts/_lib/shell_write_shapes.ts +108 -0
- package/src/scripts/_lib/structural_hiding.ts +622 -0
- package/src/scripts/_lib/test_delta.ts +166 -0
- package/src/scripts/_lib/test_provenance.ts +171 -0
- package/src/scripts/_lib/turn_end_refusals.ts +525 -4
- package/src/scripts/_lib/turn_end_transcript.ts +216 -0
- package/src/scripts/_lib/typed_op_grant.ts +246 -0
- package/src/scripts/_lib/typed_op_watch.ts +185 -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/ai_council/config.ts +8 -11
- package/src/scripts/ai_council/fallback_config.ts +5 -3
- package/src/scripts/ai_council/ownership_classes.ts +118 -0
- package/src/scripts/ai_team/team_dispatch.ts +4 -0
- package/src/scripts/ask_block_census.ts +285 -15
- package/src/scripts/before_complete_hook.ts +340 -23
- package/src/scripts/bench_hook_latency.ts +412 -5
- 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 +866 -0
- package/src/scripts/check_finding_dispositions.ts +22 -3
- package/src/scripts/check_gate_reachability.ts +173 -10
- package/src/scripts/check_generator_sync.ts +1025 -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 +47 -5
- package/src/scripts/check_kill_switch_table.ts +294 -0
- package/src/scripts/check_placeholder_drift.ts +221 -0
- package/src/scripts/check_preamble_payload_budget.ts +75 -2
- package/src/scripts/check_read_surface_coverage.ts +515 -0
- package/src/scripts/check_release_highlights.ts +33 -1
- package/src/scripts/check_release_holds.ts +568 -0
- package/src/scripts/check_routing_coverage.ts +378 -11
- package/src/scripts/check_rule_projection_integrity.ts +22 -12
- package/src/scripts/check_static_parity.ts +17 -0
- package/src/scripts/check_test_delta.ts +294 -0
- package/src/scripts/check_test_weakening.ts +299 -0
- package/src/scripts/ci_settle.ts +145 -19
- package/src/scripts/closure_scan.ts +447 -0
- package/src/scripts/compile_hook_manifest.ts +102 -18
- package/src/scripts/council_record_shape.ts +209 -0
- package/src/scripts/external_sources_denylist.json +29 -4
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +127 -11
- package/src/scripts/hooks/block_config_weakening.ts +229 -4
- package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
- package/src/scripts/hooks/block_plumbing_writes.ts +314 -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 +1 -2
- package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
- package/src/scripts/hooks/concern_registry.ts +6 -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 +221 -5
- package/src/scripts/hooks/design_slop_hook.ts +1 -2
- package/src/scripts/hooks/dispatch_hook.ts +25 -19
- 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 +97 -2
- package/src/scripts/hooks/exit_codes.ts +128 -0
- package/src/scripts/hooks/host_lowering.json +1 -0
- package/src/scripts/hooks/host_lowering.ts +128 -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 +539 -0
- package/src/scripts/hooks/obligation_settle_hook.ts +328 -0
- package/src/scripts/hooks/one_question_per_ask_hook.ts +25 -4
- package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
- 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 +55 -4
- package/src/scripts/hooks/run_continuation_hook.ts +30 -35
- 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 +49 -0
- package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
- package/src/scripts/hooks/telemetry_usage_hook.ts +1 -2
- package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
- package/src/scripts/hooks/turn_end_gate_hook.ts +337 -324
- package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
- package/src/scripts/hooks_doctor.ts +85 -0
- package/src/scripts/hooks_status.ts +19 -0
- package/src/scripts/install.ts +109 -210
- package/src/scripts/janitor.ts +7 -0
- package/src/scripts/lint_decision_classes.ts +464 -0
- 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 +66 -0
- package/src/scripts/lint_major_migration_sections.ts +450 -0
- package/src/scripts/lint_plan_risk_register.ts +47 -3
- package/src/scripts/lint_roadmap_blockers.ts +139 -12
- package/src/scripts/lint_roadmap_producers.ts +202 -0
- package/src/scripts/lint_skill_descriptions.ts +1 -1
- package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
- package/src/scripts/mcp_server/prompts.ts +142 -1
- package/src/scripts/measure_rule_budget.ts +101 -5
- package/src/scripts/measure_skill_ranker_baseline.ts +305 -51
- package/src/scripts/measure_turn_end_gate.ts +193 -0
- package/src/scripts/memory_lookup.ts +1 -1
- package/src/scripts/new_roadmap.ts +37 -0
- package/src/scripts/orchestration_record.ts +0 -5
- package/src/scripts/prepack-check.mjs +53 -0
- package/src/scripts/release.ts +14 -98
- package/src/scripts/release_drill.ts +267 -1
- package/src/scripts/release_publication.ts +64 -1
- package/src/scripts/report_enforcement_drift.ts +566 -0
- package/src/scripts/report_host_injection_effect.ts +3 -11
- package/src/scripts/report_invocation_surface.ts +383 -0
- package/src/scripts/report_obligation_carriers.ts +699 -0
- package/src/scripts/report_obligation_writer_split.ts +236 -0
- package/src/scripts/report_skill_menu_census.ts +208 -0
- package/src/scripts/report_standing_payload_by_host.ts +26 -152
- package/src/scripts/roadmap_verify_share.ts +213 -0
- package/src/scripts/schemas/agent-settings.schema.json +23 -0
- package/src/scripts/schemas/command.schema.json +48 -0
- package/src/scripts/schemas/review-findings.schema.json +4 -0
- package/src/scripts/schemas/skill.schema.json +44 -0
- package/src/scripts/scope_growth.ts +219 -0
- package/src/scripts/self_review_gate.ts +359 -10
- package/src/scripts/semantic_parity_census.ts +314 -0
- package/src/scripts/session_eol_report.ts +54 -1
- package/src/scripts/sweep_dead_scan_roots.ts +1 -1
- package/src/scripts/trigger_eval_grandfather.json +0 -3
- package/src/scripts/trigger_eval_rotation.ts +122 -27
- package/src/scripts/ui_conformance_probe.ts +774 -0
- package/src/scripts/update_prices.ts +85 -3
- package/src/scripts/write_bundle_digest.mjs +74 -0
- package/src/server/schemas/settings.ts +62 -7
- package/src/shared/missionExecution.ts +126 -0
- package/src/templates/consumer-settings/ONBOARDING.md +1 -0
- package/dist/cli-delegate/chunk-523HCFYO.js +0 -90
- package/dist/ui/assets/index-D0jaCRPM.js +0 -29
- package/dist/ui/assets/index-jSfMW8_t.css +0 -1
- /package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-7RQP4UDH.js} +0 -0
|
@@ -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
|
+
}
|
|
@@ -543,6 +543,7 @@ export type QuorumMinPresent = number;
|
|
|
543
543
|
|
|
544
544
|
export type { FallbackConfig } from './fallback_config.js';
|
|
545
545
|
import { buildFallback, buildSecondModel, type FallbackConfig as _FallbackConfig } from './fallback_config.js';
|
|
546
|
+
import { OWNERSHIP_CLASSES, allOwnerLocked, defaultModeFor, ownershipModeError } from './ownership_classes.js';
|
|
546
547
|
import {
|
|
547
548
|
_f,
|
|
548
549
|
_pyOct,
|
|
@@ -1182,13 +1183,7 @@ const _LOCKED_IMPACT_CLASSES: ReadonlySet<string> = new Set([
|
|
|
1182
1183
|
'user_required',
|
|
1183
1184
|
]);
|
|
1184
1185
|
|
|
1185
|
-
const
|
|
1186
|
-
trivial: 'agent',
|
|
1187
|
-
low_impact: 'agent',
|
|
1188
|
-
medium_impact: 'council',
|
|
1189
|
-
high_impact: 'user',
|
|
1190
|
-
user_required: 'user',
|
|
1191
|
-
};
|
|
1186
|
+
const _ALL_OWNER_LOCKED = allOwnerLocked(_LOCKED_IMPACT_CLASSES);
|
|
1192
1187
|
|
|
1193
1188
|
function _build_decision_resolution(d: Dict): DecisionResolutionConfig {
|
|
1194
1189
|
if (!_isDict(d)) {
|
|
@@ -1207,14 +1202,14 @@ function _build_decision_resolution(d: Dict): DecisionResolutionConfig {
|
|
|
1207
1202
|
);
|
|
1208
1203
|
}
|
|
1209
1204
|
const classes = new Map<string, DecisionResolutionEntry>();
|
|
1210
|
-
for (const cls of _IMPACT_CLASSES) {
|
|
1205
|
+
for (const cls of [..._IMPACT_CLASSES, ...OWNERSHIP_CLASSES]) {
|
|
1211
1206
|
const entry_raw = _orEmpty(classes_raw[cls] ?? null);
|
|
1212
1207
|
if (!_isDict(entry_raw)) {
|
|
1213
1208
|
throw new CouncilConfigError(
|
|
1214
1209
|
`\`decision_resolution.classes.${cls}\` must be a mapping.`,
|
|
1215
1210
|
);
|
|
1216
1211
|
}
|
|
1217
|
-
const mode = _get(entry_raw, 'mode',
|
|
1212
|
+
const mode = _get(entry_raw, 'mode', defaultModeFor(cls));
|
|
1218
1213
|
if (!(_isStr(mode) && _VALID_RESOLUTION_MODES.has(mode))) {
|
|
1219
1214
|
throw new CouncilConfigError(
|
|
1220
1215
|
`decision_resolution.classes.${cls}.mode=${_pyRepr(mode)} not in ` +
|
|
@@ -1230,10 +1225,12 @@ function _build_decision_resolution(d: Dict): DecisionResolutionConfig {
|
|
|
1230
1225
|
`the user.`,
|
|
1231
1226
|
);
|
|
1232
1227
|
}
|
|
1228
|
+
const ownErr = ownershipModeError(cls, mode, _pyRepr);
|
|
1229
|
+
if (ownErr !== null) throw new CouncilConfigError(ownErr);
|
|
1233
1230
|
// Iron Law: `dispatch` is not configurable for locked classes
|
|
1234
1231
|
// (step-9 P8/P11 · U3). Any nested `dispatch` key — including
|
|
1235
1232
|
// smuggled-in YAML anchor merges — is a hard schema error.
|
|
1236
|
-
if (
|
|
1233
|
+
if (_ALL_OWNER_LOCKED.has(cls) && 'dispatch' in entry_raw) {
|
|
1237
1234
|
throw new CouncilConfigError(
|
|
1238
1235
|
`decision_resolution.classes.${cls}.dispatch=` +
|
|
1239
1236
|
`${_pyRepr(entry_raw.dispatch)}: dispatch is not ` +
|
|
@@ -1251,7 +1248,7 @@ function _build_decision_resolution(d: Dict): DecisionResolutionConfig {
|
|
|
1251
1248
|
// UOTL Phase 4.1 — the optional local rung, REFUSED on a locked
|
|
1252
1249
|
// class rather than ignored: a dropped key reads as configured.
|
|
1253
1250
|
const second_model = buildSecondModel(
|
|
1254
|
-
entry_raw as Record<string, unknown>, cls,
|
|
1251
|
+
entry_raw as Record<string, unknown>, cls, _ALL_OWNER_LOCKED, _FALLBACK_DEPS);
|
|
1255
1252
|
classes.set(cls, { mode, confidence_threshold: threshold, second_model });
|
|
1256
1253
|
}
|
|
1257
1254
|
const fast_path_raw = _getOr(d, 'fast_path', {});
|
|
@@ -107,9 +107,11 @@ export function buildSecondModel(
|
|
|
107
107
|
if (locked.has(cls)) {
|
|
108
108
|
throw d.error(
|
|
109
109
|
`decision_resolution.classes.${cls}.second_model=${d.repr(entry['second_model'])}: ` +
|
|
110
|
-
`a second-model rung is not configurable for
|
|
111
|
-
`
|
|
112
|
-
`on
|
|
110
|
+
`a second-model rung is not configurable for an owner-routed class ` +
|
|
111
|
+
`(high-impact / user-required on the impact axis; product-owned / ` +
|
|
112
|
+
`business-owned / destructive-owned on the ownership axis) — those ` +
|
|
113
|
+
`classes are LOCKED to \`user\` (Iron Law) and never resolve on a ` +
|
|
114
|
+
`model of any kind.`,
|
|
113
115
|
);
|
|
114
116
|
}
|
|
115
117
|
const raw = entry['second_model'];
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ownership axis of `decision_resolution` (ADR-268 § 10).
|
|
3
|
+
*
|
|
4
|
+
* A separate module rather than more constants in `config.ts`, for two
|
|
5
|
+
* reasons. That file is 700+ lines over the source ceiling already, so every
|
|
6
|
+
* line added there moves a ratchet; and these sets are read by the loader AND
|
|
7
|
+
* by the roadmap-side gate, which has no business importing the council's
|
|
8
|
+
* whole schema to learn eight class names.
|
|
9
|
+
*
|
|
10
|
+
* The axis changes from IMPACT to OWNERSHIP: a technical decision does not
|
|
11
|
+
* become owner-owned because it is hard or high-impact. The five impact names
|
|
12
|
+
* stay accepted for one minor so no installed `.ai-council.yml` fails to load,
|
|
13
|
+
* and they keep their own (impact-axis) Iron Law — they are deliberately NOT
|
|
14
|
+
* in this module.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** The eight ownership classes, in table order. */
|
|
18
|
+
export const OWNERSHIP_CLASSES: readonly string[] = [
|
|
19
|
+
'deterministic',
|
|
20
|
+
'reversible-technical',
|
|
21
|
+
'contested-technical',
|
|
22
|
+
'critical-technical',
|
|
23
|
+
'product-owned',
|
|
24
|
+
'business-owned',
|
|
25
|
+
'destructive-owned',
|
|
26
|
+
'spend-exhaustion',
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Iron Law: ONLY these three are locked to `user`. `critical-technical` is
|
|
31
|
+
* deliberately absent — locking it is the § 0 break ADR-268 names by hand
|
|
32
|
+
* ("routing a technical decision to the owner because it is hard or
|
|
33
|
+
* high-impact"), so the absence is load-bearing rather than an oversight.
|
|
34
|
+
*/
|
|
35
|
+
export const OWNER_LOCKED_CLASSES: ReadonlySet<string> = new Set([
|
|
36
|
+
'product-owned',
|
|
37
|
+
'business-owned',
|
|
38
|
+
'destructive-owned',
|
|
39
|
+
]);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Iron Law: `spend-exhaustion` PAUSES AND REPORTS (ADR-268 § 8). It is never
|
|
43
|
+
* routed to the owner as a question, so `mode: user` on it is a hard schema
|
|
44
|
+
* error rather than an unusual-but-legal setting.
|
|
45
|
+
*/
|
|
46
|
+
export const NEVER_OWNER_CLASSES: ReadonlySet<string> = new Set(['spend-exhaustion']);
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Both owner-routed sets as one, given the impact axis's own locked set.
|
|
50
|
+
*
|
|
51
|
+
* A function rather than a constant because the impact half lives in the
|
|
52
|
+
* loader: importing it here would make this module depend on the schema it is
|
|
53
|
+
* imported BY, which is the cycle the split exists to avoid.
|
|
54
|
+
*/
|
|
55
|
+
export function allOwnerLocked(impactLocked: ReadonlySet<string>): ReadonlySet<string> {
|
|
56
|
+
return new Set<string>([...impactLocked, ...OWNER_LOCKED_CLASSES]);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Default `mode` per class, BOTH axes — the resolver column of each table.
|
|
61
|
+
*
|
|
62
|
+
* The five impact rows moved here with the eight ownership ones so there is
|
|
63
|
+
* exactly one place a reader asks "what does this class do when nobody
|
|
64
|
+
* configured it", rather than one map per axis drifting against the other.
|
|
65
|
+
*/
|
|
66
|
+
export const DEFAULT_RESOLUTION_MODES: Readonly<Record<string, string>> = {
|
|
67
|
+
trivial: 'agent',
|
|
68
|
+
low_impact: 'agent',
|
|
69
|
+
medium_impact: 'council',
|
|
70
|
+
high_impact: 'user',
|
|
71
|
+
user_required: 'user',
|
|
72
|
+
deterministic: 'agent',
|
|
73
|
+
'reversible-technical': 'agent',
|
|
74
|
+
'contested-technical': 'council',
|
|
75
|
+
'critical-technical': 'council',
|
|
76
|
+
'product-owned': 'user',
|
|
77
|
+
'business-owned': 'user',
|
|
78
|
+
'destructive-owned': 'user',
|
|
79
|
+
'spend-exhaustion': 'agent',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/** The default `mode` for a class, or `agent` for a name neither axis knows. */
|
|
83
|
+
export function defaultModeFor(cls: string): string {
|
|
84
|
+
return DEFAULT_RESOLUTION_MODES[cls] ?? 'agent';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* The ownership axis's mode check, as one function.
|
|
89
|
+
*
|
|
90
|
+
* Both Iron Laws live here rather than at the call site so the loader carries
|
|
91
|
+
* three lines instead of twenty-four — and so a reader looking for "which
|
|
92
|
+
* classes are locked" finds the rule next to the sets it reads.
|
|
93
|
+
*
|
|
94
|
+
* Returns the error message, or `null` when the mode is legal. `repr` is the
|
|
95
|
+
* caller's own value formatter, so the message reads identically to every
|
|
96
|
+
* other schema error in the loader.
|
|
97
|
+
*/
|
|
98
|
+
export function ownershipModeError(
|
|
99
|
+
cls: string,
|
|
100
|
+
mode: string,
|
|
101
|
+
repr: (v: unknown) => string,
|
|
102
|
+
): string | null {
|
|
103
|
+
if (OWNER_LOCKED_CLASSES.has(cls) && mode !== 'user') {
|
|
104
|
+
return (
|
|
105
|
+
`decision_resolution.classes.${cls}.mode=${repr(mode)}: ` +
|
|
106
|
+
`class \`${cls}\` is LOCKED to \`user\` (Iron Law) — product, business and ` +
|
|
107
|
+
`destructive decisions are owner-owned and never resolve on a model.`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
if (NEVER_OWNER_CLASSES.has(cls) && mode === 'user') {
|
|
111
|
+
return (
|
|
112
|
+
`decision_resolution.classes.${cls}.mode=${repr(mode)}: ` +
|
|
113
|
+
`class \`${cls}\` is never owner-routed (Iron Law) — spend exhaustion ` +
|
|
114
|
+
`pauses and reports, it does not ask.`
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
@@ -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';
|