@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
|
@@ -247,8 +247,21 @@ dispatch runs, not WHETHER the layer exists, so they keep their own C rows.
|
|
|
247
247
|
|---|---|
|
|
248
248
|
| A — preference | 26 |
|
|
249
249
|
| B — consent | 3 |
|
|
250
|
-
| C — guarded |
|
|
251
|
-
| **Total** | **
|
|
250
|
+
| C — guarded | 124 |
|
|
251
|
+
| **Total** | **153** |
|
|
252
|
+
|
|
253
|
+
It rose again on 2026-09-13 when `road-to-adversarial-verification-and-long-runs`
|
|
254
|
+
Phase 0 added three C keys: `quality.local_auto_run_in_mission` (`consent` — it
|
|
255
|
+
decides whether local verification runs at all inside a mission, which is the
|
|
256
|
+
same decision `quality.local_auto_run` carries for chat) and the two
|
|
257
|
+
`execution:` leaves, `fix_loop_max` and `escalation` (both `policy` — they bound
|
|
258
|
+
and route an autonomous run's own recovery, and an agent that could widen its own
|
|
259
|
+
bound has no bound). None is `derivable`: each states something no other surface
|
|
260
|
+
computes, so the anti-regrowth ratchet on that disposition is untouched. Two
|
|
261
|
+
branches added keys on the same day, so the totals in both tables are re-derived
|
|
262
|
+
from the class table on the MERGED tree rather than by adding either side's
|
|
263
|
+
delta — which is the arithmetic `lint_settings_classes` checks, and picking a
|
|
264
|
+
side is how a stated count comes to describe a tree that no longer exists.
|
|
252
265
|
|
|
253
266
|
It rose to 142 on 2026-09-08 from two independent additions that landed in the same
|
|
254
267
|
day and are counted together here: `lean_projection.hosts` (one C, `policy`, from
|
|
@@ -369,9 +382,9 @@ the template, which is the drift this contract exists to prevent.
|
|
|
369
382
|
|---|---|
|
|
370
383
|
| derivable | 83 |
|
|
371
384
|
| un-inferrable | 9 |
|
|
372
|
-
| consent |
|
|
373
|
-
| policy |
|
|
374
|
-
| **Total** | **
|
|
385
|
+
| consent | 47 |
|
|
386
|
+
| policy | 14 |
|
|
387
|
+
| **Total** | **153** |
|
|
375
388
|
|
|
376
389
|
First measured 2026-08-12 at 140 leaves (derivable 88 · consent 38 ·
|
|
377
390
|
un-inferrable 9 · policy 5), from the table below rather than predicted — the
|
|
@@ -474,7 +487,7 @@ Rows follow template order, so a diff against the template reads straight down.
|
|
|
474
487
|
| `projection.rule_packs` | C | `[]` | second allowlist axis on rule projection | derivable — the `auto` derivation already implemented in `src/install/rule_scope.ts` |
|
|
475
488
|
| `discipline_profile` | C | `__DISCIPLINE_PROFILE__` | master switch for the discipline rule tier | derivable — its own `auto` resolution against `src/config/host-capabilities.yml` |
|
|
476
489
|
| `rule_loading_tier` | C | `__RULE_LOADING_TIER__` | legacy master switch for rule loading | derivable — `discipline_profile` supersedes it with a documented mapping (minimal→off, balanced→essential, full→full) |
|
|
477
|
-
| `lean_projection.mode` | C | `
|
|
490
|
+
| `lean_projection.mode` | C | `delivery` | `thin` and `delivery` remove rule bodies from the agent's standing context. Two defaults, and this column carries the template one: the shipped template has said `delivery` since ADR-267, while the parser fallback for a value that resolves from no layer stays `eager-all` (ADR-267 decision 4) | derivable — `probe_host_compliance.ts` already computes the per-host thin/eager recommendation |
|
|
478
491
|
| `lean_projection.hosts` | C | `[claude-code]` | decides WHICH hosts a thinning mode may thin, so an added id removes rule bodies from that host's context | policy — the value is a package-level decision the tree already holds: ADR-267 scopes the shipped `delivery` flip to `claude-code` alone. NOT `derivable`, and the distinction is the whole reason for this row: the mechanism that would compute an admissible host set, `admissibleUnderE3` in `src/scripts/_lib/injection_effect.ts`, admits **nothing** today — `src/config/host-injection-effect.json` carries 1 `observed-false` and 8 `unobserved` rows and no `observed-true` — so a derivation would yield `[]` rather than the shipped `[claude-code]`. Naming a mechanism that returns empty as the replacement would put a key in the deletion queue whose deletion would silently change the default. Move target: the ADR plus that census, once a host earns an `observed-true` row |
|
|
479
492
|
| `telegraph.speak` | C | `false` | ships a rule body; a token-cost lever in both directions | derivable — the telegraph kill-criterion bench verdict is a package-level decision, not a per-install one |
|
|
480
493
|
| `tokens.rich_skills` | C | `"on"` | token-spend lever | derivable — the skill's own `token_budget_class: rich` declaration plus the CI ceiling in `lint_token_budget_discipline.ts` |
|
|
@@ -506,6 +519,11 @@ Rows follow template order, so a diff against the template reads straight down.
|
|
|
506
519
|
| `project.improvement_pr_branch_prefix` | A | `improve/agent-` | branch-name cosmetics | derivable — the repo's own branch-naming convention, observable from `git branch -r` |
|
|
507
520
|
| `project.audience` | C | `public` | C-test 4 — it governs the agent's own reasoning discipline: `self` makes the § 8-pre demand gate inert. Who a project is built for is a fact only its maintainer knows, so the agent never infers it and never asks; hand-edit or the GUI write route. The default is today's behaviour, so an install that never sets it is unchanged | policy |
|
|
508
521
|
| `github.pr_reply_method` | A | `create_review_comment` | picks between two endpoints of one operation | derivable — the `auto` value already in the enum: the routing detects the working endpoint on first use and writes it back |
|
|
522
|
+
| `delivery.merge` | C | `off` | C-test 1 — it is the configuration half of merge authority, resolved by ADR-268 section 3. An agent that could write it could grant itself the capability the key gates, which is the exact shape the C fence exists to refuse. `off` is today's behavior, so an install that never sets it is unchanged | consent |
|
|
523
|
+
| `delivery.wait_for_ci` | C | `true` | C-test 1 — it authorises the run to keep spending time and tokens driving CI to a verdict rather than ending at push. A standing authorisation over the agent's own consumption is not a preference | consent |
|
|
524
|
+
| `delivery.pr_topology` | C | `single` | C-test 4 — `stacked` is a plan the owner makes, never one the agent picks, and the roadmap surface that consumes it is written before execution. An agent-writable value here would let a run choose its own delivery shape mid-mission | policy |
|
|
525
|
+
| `host_environment.request_size_caps.bash_max_output_length` | C | `null` | C-test 1 — it is written into the HOST's own environment, where it changes behavior the consumer did not ask for. An agent-writable value here would let a run reshape its own request budget in the consumer's settings file, which is the capability the key gates. `null` is today's behavior: nothing is written | policy |
|
|
526
|
+
| `host_environment.request_size_caps.max_mcp_output_tokens` | C | `null` | C-test 1 — same surface and same reason as the row above; the pair is the whole writable set, and no traffic or auto-updater variable is expressible beside them by construction | policy |
|
|
509
527
|
| `augment.rules_use_symlinks` | A | `false` | reversible install mechanics | derivable — dev-mode detection at install time plus a symlink-capability probe on the target filesystem |
|
|
510
528
|
| `eloquent.access_style` | A | `getters_setters` | code convention | derivable — the convention the project's existing models already use; `standards-from-config` reads it off the tree |
|
|
511
529
|
| `chat_history.enabled` | C | `true` | kill-switch over a path that writes conversation content to disk | consent |
|
|
@@ -532,10 +550,13 @@ Rows follow template order, so a diff against the template reads straight down.
|
|
|
532
550
|
| `roadmap.horizon_weeks` | C | `0` | a non-zero value relaxes a lint's plate-token ban | policy |
|
|
533
551
|
| `roadmap.gate_budget.max_cost_per_run_usd` | C | `5` | per-run spend ceiling on class-1 gate execution | consent |
|
|
534
552
|
| `roadmap.gate_budget.max_cost_per_rolling_7d_usd` | C | `25` | rolling spend ceiling on class-1 gate execution | consent |
|
|
535
|
-
| `planning.
|
|
553
|
+
| `planning.closure_pass` | C | `true` | disables the plan-closure pass | derivable — the gate's own confidence conditions; a confident plan passes straight through |
|
|
536
554
|
| `planning.risk_review` | C | `true` | disables the risk-register validator | derivable — `lint_plan_risk_register`'s own scope predicate (ready, non-draft plans only) |
|
|
537
555
|
| `planning.completion_review` | C | `true` | disables the completion-review validator | derivable — `check_completion_review`'s own scope predicate, bound to the current diff hash |
|
|
538
556
|
| `quality.local_auto_run` | C | `false` | governs whether local verification runs at all | consent |
|
|
557
|
+
| `quality.local_auto_run_in_mission` | C | `true` | governs whether local verification runs at all inside an autonomous mission | consent |
|
|
558
|
+
| `execution.fix_loop_max` | C | `10` | bounds how long an autonomous run may keep attempting one failing target | policy |
|
|
559
|
+
| `execution.escalation` | C | `['independent', 'council', 'team', 'owner_owned_check']` | names the rungs an autonomous run walks before any owner ask | policy |
|
|
539
560
|
| `design.fidelity_mode` | C | `strict` | strict-mode selector, one of whose values is a Hard Floor | policy |
|
|
540
561
|
| `design.approximation.enabled` | C | `false` | lets a value change without a per-value confirmation; enabling it is a consumer-facing default flip | consent |
|
|
541
562
|
| `design.approximation.tolerance.color` | C | `null` | decides which colour deviations may be taken silently | policy |
|
|
@@ -93,6 +93,63 @@ Update stale idioms to the version the project **actually runs** — but only wh
|
|
|
93
93
|
- Subordinate to `no-cheap-questions` (self-check items 3 & 14 — real trade-off, not a disguised continuation/commit ask), `autonomous-execution` (the end-of-session batch must not read as "shall I continue?"), `user-interaction`, `ask-when-uncertain` (one batched prompt = one question).
|
|
94
94
|
- Threshold to surface at all: a **real, nameable** improvement with a concrete benefit. Cosmetic nitpicks with no trade-off → drop silently. The live-security carve-out is the only case that interrupts or overrides autonomy.
|
|
95
95
|
|
|
96
|
+
## The other axis — who owns the growth
|
|
97
|
+
|
|
98
|
+
The ladder above sizes a change: *is this small and aligned enough to do now.*
|
|
99
|
+
It does not say **whose decision it is**, and both must clear before work
|
|
100
|
+
happens inline — something small and council-owned is still not the agent's to
|
|
101
|
+
decide, and something agent-owned and large is still bounded by
|
|
102
|
+
`minimal-safe-diff`.
|
|
103
|
+
|
|
104
|
+
Three closed lists answer the ownership half: six agent-owned kinds (done
|
|
105
|
+
inline, recorded as a scope delta in the PR body, never asked about), four
|
|
106
|
+
council-owned (routed through the ownership ladder, reaching the owner in none
|
|
107
|
+
of them), and two owner-owned. Anything matching none of them is not scope
|
|
108
|
+
growth at all — it is a follow-up artifact, and the mission does not expand to
|
|
109
|
+
hold it.
|
|
110
|
+
|
|
111
|
+
Full enumeration: [`scope-growth-ownership`](../../../src/agent-src/contexts/authority/scope-growth-ownership.md).
|
|
112
|
+
One item classifies deterministically with
|
|
113
|
+
`./scripts-run src/scripts/scope_growth "<description>"`; `unknown` is a real
|
|
114
|
+
verdict there, never a fallback to the cheapest rung.
|
|
115
|
+
|
|
116
|
+
## Inside a mission — the middle rung becomes an artifact
|
|
117
|
+
|
|
118
|
+
`road-to-adversarial-verification-and-long-runs` 6.1. The ladder's middle rung is
|
|
119
|
+
**note + ask**, and inside an autonomous mission there is nobody to ask. Left
|
|
120
|
+
unreplaced the rung collapses in one of two bad directions, and both are failures
|
|
121
|
+
this suite already names: every spotted issue becomes a fix (the scope creep
|
|
122
|
+
[`minimal-safe-diff`](minimal-safe-diff-mechanics.md) exists to stop), or every
|
|
123
|
+
one becomes silence (the look-away `active-remediation` exists to stop).
|
|
124
|
+
|
|
125
|
+
So under a mission the middle rung is **emit a follow-up artifact and leave the
|
|
126
|
+
code alone**.
|
|
127
|
+
|
|
128
|
+
**What may ride along at all** — nine kinds, and the list is closed:
|
|
129
|
+
characterization tests · regression tests · a small adjacent bug · naming · types
|
|
130
|
+
· robustness · local dead code · simplifying code the mission already touched ·
|
|
131
|
+
testability.
|
|
132
|
+
|
|
133
|
+
**Six criteria, ALL of which must hold** for one of those to ride along: local to
|
|
134
|
+
the path the mission is already touching · small · low blast radius · clearly
|
|
135
|
+
correct · testable in the same commit · carries no new product decision.
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
THE SIX ARE AND-ED, NEVER SCORED.
|
|
139
|
+
A SCORED VERSION LETS A LARGE CHANGE BUY ITS WAY IN WITH FIVE CHEAP YESES,
|
|
140
|
+
WHICH IS HOW A BOY-SCOUT RULE BECOMES A REFACTOR LICENCE.
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
The **characterisation is the agent's judgement; the DECISION is mechanical** —
|
|
144
|
+
`_lib/rides_along.ts` takes the six booleans and returns the rung, so the same
|
|
145
|
+
inputs always land the same way and a later reader can check the call rather than
|
|
146
|
+
re-litigate the taste.
|
|
147
|
+
|
|
148
|
+
**A deferral states every reason it was deferred**, not the first one it hit. The
|
|
149
|
+
artifact exists because the issue is still owed, and "it failed one of six" is not
|
|
150
|
+
something a later triage can act on. A deferral with no reason is the
|
|
151
|
+
note-and-forget this rule already forbids, wearing an artifact's clothes.
|
|
152
|
+
|
|
96
153
|
## See also
|
|
97
154
|
|
|
98
155
|
- [`active-remediation`](../../../src/rules/active-remediation.md) — the rule this file details (Iron Law + ladder + live-security carve-out).
|
|
@@ -86,6 +86,108 @@ point: this rule exists because a process that *looked* followed produced
|
|
|
86
86
|
fabricated evidence, and claiming coverage it does not have would repeat that.
|
|
87
87
|
|
|
88
88
|
|
|
89
|
+
## The audited failure, in full
|
|
90
|
+
|
|
91
|
+
Migrated out of the rule on 2026-09-13 under the same P4 pattern the rest of this
|
|
92
|
+
page follows: the rule keeps the obligation, this page carries the record. The
|
|
93
|
+
rule was re-sending all of it on every session and every spawn.
|
|
94
|
+
|
|
95
|
+
Measured, once, at maximum cost (conformance audit 2026-08-06):
|
|
96
|
+
|
|
97
|
+
> The agent dispatched a "blind reviewer" over its own change. It wrote that
|
|
98
|
+
> reviewer's prompt itself, put **"NO-FINDINGS is expected and welcome"** into it,
|
|
99
|
+
> and narrowed the scope to four files it chose. The reviewer returned
|
|
100
|
+
> NO-FINDINGS. That honest-null was committed as **binding gate evidence**. An
|
|
101
|
+
> unsteered pass over the same delta later found 5 findings, one of them
|
|
102
|
+
> critical, already live on the trunk.
|
|
103
|
+
|
|
104
|
+
The agent's own retro named it exactly, in the maintainer's own words:
|
|
105
|
+
|
|
106
|
+
*DE: "Die Fabrikation lag nicht im Weglassen des Reviews — sie lag in meinem Prompt. Ich habe die Antwort vorgeladen und dann als Evidenz verbucht." · EN: "The fabrication was not in skipping the review — it was in my prompt. I pre-loaded the answer and then booked it as evidence."*
|
|
107
|
+
|
|
108
|
+
The review ran. The process was followed. The evidence was manufactured anyway.
|
|
109
|
+
|
|
110
|
+
## The softer form — why the phrase list cannot see it
|
|
111
|
+
|
|
112
|
+
The Iron Law forbids **authoring the verdict** into an evaluator's prompt. There
|
|
113
|
+
is a weaker move that evades it while doing the same work, and it is the one an
|
|
114
|
+
orchestrator reaches for without noticing: **stating an expectation**.
|
|
115
|
+
|
|
116
|
+
*"NO-FINDINGS is expected"* is a prediction, not a verdict — and it steered a real
|
|
117
|
+
review into an honest-null that five findings on the trunk later refuted. A prompt
|
|
118
|
+
that says what the author thinks the answer is has authored the answer, whatever
|
|
119
|
+
grammatical mood it used. The guard's pre-loaded-verdict detector is a PHRASE
|
|
120
|
+
list, so it catches recurrences of known steering wording and not steering as
|
|
121
|
+
such; this distinction is the gap it cannot close, which is why the obligation is
|
|
122
|
+
stated in the rule rather than delegated to the detector.
|
|
123
|
+
|
|
124
|
+
## Tests are evaluators — levels, workflow, and the weakening ladder
|
|
125
|
+
|
|
126
|
+
`road-to-adversarial-verification-and-long-runs` Phase 2. The rule states the
|
|
127
|
+
obligation; this section carries the detail it points at.
|
|
128
|
+
|
|
129
|
+
### The five levels
|
|
130
|
+
|
|
131
|
+
| Level | Author | What it actually buys |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| **L0** | the same agent, same session | nothing against self-confirmation. **Fallback only** — permitted when no other route exists, and then said out loud. |
|
|
134
|
+
| **L1** | another session, same model | a fresh context. **Not** a different judgement: with one provider configured this is the same model reviewing its own work, holding a label that says otherwise. |
|
|
135
|
+
| **L2** | another model | different training, different blind spots. The first level that buys a genuinely second opinion. |
|
|
136
|
+
| **L3** | another provider | independent training data, independent failure modes, independent incentives. |
|
|
137
|
+
| **L4** | a multi-provider council or team | L3 plus disagreement that is visible rather than averaged away. |
|
|
138
|
+
|
|
139
|
+
**Critical behavior — security, authority, data loss, merge control — targets
|
|
140
|
+
L3 or L4 wherever two providers are configured.** Wherever, not always: with one
|
|
141
|
+
provider the honest ceiling is L2, and the level is read from `agent-config
|
|
142
|
+
council:status`'s actual provider count rather than assumed from a config file
|
|
143
|
+
that may describe an intention.
|
|
144
|
+
|
|
145
|
+
### The workflow
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
acceptance behaviour → INDEPENDENT AUTHOR → RED evidence → implementer → GREEN
|
|
149
|
+
→ INDEPENDENT VALIDATOR
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Five arrows, and the two capitalised roles are the ones that may not be the
|
|
153
|
+
implementer. **RED evidence** is not ceremony: a test never shown red has unknown
|
|
154
|
+
sensitivity, so a suite that was green from the first run has proven nothing
|
|
155
|
+
about the code and everything about the assertions being vacuous.
|
|
156
|
+
|
|
157
|
+
### What an implementer may never do silently
|
|
158
|
+
|
|
159
|
+
Weaken an assertion · delete a failing test · skip or `xfail` it · loosen a
|
|
160
|
+
threshold · change fixture semantics to fit the code.
|
|
161
|
+
|
|
162
|
+
Each of these is a legitimate change *sometimes*, which is exactly why the
|
|
163
|
+
prohibition is on doing it **silently** rather than on doing it. Where the test
|
|
164
|
+
genuinely looks wrong, the ladder is: **evidence** (what the test asserts, what
|
|
165
|
+
the code does, why they disagree) → **independent test review** → **council or
|
|
166
|
+
team** → change only after an independent verdict.
|
|
167
|
+
|
|
168
|
+
**The owner is not the arbiter.** Routing this to the owner converts a technical
|
|
169
|
+
disagreement the tree can settle into an interrupt only the owner can clear, and
|
|
170
|
+
it is the same count-to-an-ask move the recovery ladder removes.
|
|
171
|
+
|
|
172
|
+
### Test-quality validation — one question, before delivery
|
|
173
|
+
|
|
174
|
+
*Would these tests fail under plausible wrong implementations?* An independent
|
|
175
|
+
instance answers it, looking for: tautologies · algorithm duplication (the test
|
|
176
|
+
re-implements the thing it is testing, so both are wrong together) · snapshot
|
|
177
|
+
overuse · missing boundary and error cases · over-mocking (the mock, not the
|
|
178
|
+
code, is what passes) · expectations changed to fit the code · a test never shown
|
|
179
|
+
red.
|
|
180
|
+
|
|
181
|
+
The validator's **identity and provider go into the evidence**. An unattributed
|
|
182
|
+
validation is not one — it cannot be checked for the independence it claims, and
|
|
183
|
+
`evaluator-independence`'s own recorded failure is exactly a verdict nobody could
|
|
184
|
+
trace back to the prompt that produced it.
|
|
185
|
+
|
|
186
|
+
This is deliberately **not** mutation-testing infrastructure (K3 of that
|
|
187
|
+
roadmap). Mutation testing is the industrial form of the same question; one
|
|
188
|
+
independent instance asking it in prose is the cheap first form, and shipping the
|
|
189
|
+
cheap form now beats deferring the question until the infrastructure exists.
|
|
190
|
+
|
|
89
191
|
## See also
|
|
90
192
|
|
|
91
193
|
- [`evaluator-independence`](../../../src/rules/evaluator-independence.md) — the rule this page carries the argument for.
|
|
@@ -13,6 +13,35 @@ Migrated out of `design-fidelity.md` on 2026-09-09 under the council verdict on
|
|
|
13
13
|
the operative pointers the same verdict requires, not an arbitrary line cut. The
|
|
14
14
|
rule keeps the obligations; this holds the reasoning behind them.
|
|
15
15
|
|
|
16
|
+
### The matcher, and why each shipped class is shaped that way
|
|
17
|
+
|
|
18
|
+
Migrated out of `design-fidelity.md` on 2026-09-18 under
|
|
19
|
+
`road-to-design-fidelity-proof` Phase 1.1 — the rule keeps the operative class
|
|
20
|
+
list, this holds the argument behind each one.
|
|
21
|
+
|
|
22
|
+
Matching is plain lower-cased substring containment on the prompt, plus fnmatch
|
|
23
|
+
over the open files. Three handover classes must reach this rule: an English
|
|
24
|
+
phrasing, a German one, and a prompt carrying **no** keyword at all because the
|
|
25
|
+
artifact is simply attached. The last is covered by two file patterns:
|
|
26
|
+
`*design.html`, the conventional handover filename, and `*.dc.html`, the Claude
|
|
27
|
+
Design canvas artboard — which `*design.html` cannot match, because it compiles
|
|
28
|
+
to `^(?:.*design\.html)$` and `ToDo.dc.html` does not end in `design.html`.
|
|
29
|
+
Neither is `*.html`, which would fire on every HTML edit in every project and be
|
|
30
|
+
strictly worse than the gap it closes; `near-plain-html-open-file` pins that
|
|
31
|
+
form silent. A handover under some other filename needs one word in the prompt.
|
|
32
|
+
|
|
33
|
+
Two further handover shapes carry the artifact without any of the above:
|
|
34
|
+
|
|
35
|
+
- **A capability URL.** A published artifact is handed over as a link, not a
|
|
36
|
+
file — so `phrase: "claude.site/artifacts"` fires on the *published-artifact
|
|
37
|
+
path*, not on the host. `claude.ai` alone is a chat link and must stay quiet:
|
|
38
|
+
a keyword on the bare domain would fire on "I pasted this from claude.ai",
|
|
39
|
+
which is a conversation reference, not a spec.
|
|
40
|
+
- **A design-system directory.** `path_prefix: ".claude/design-system/"` — the
|
|
41
|
+
conventional location for a handed-over token/component set. The prefix is the
|
|
42
|
+
vendor-scoped directory, never a bare `design-system/`, which is a normal
|
|
43
|
+
source folder in a large fraction of frontend repos.
|
|
44
|
+
|
|
16
45
|
### The withdrawn builder-URL trigger
|
|
17
46
|
|
|
18
47
|
A page built in Lovable / v0 / bolt and handed over as a share link is a
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@event4u/agent-config",
|
|
3
3
|
"mcpName": "io.github.event4u-app/agent-config",
|
|
4
|
-
"version": "16.
|
|
4
|
+
"version": "16.2.0",
|
|
5
5
|
"description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) — every claim machine-checked, including the counts in these badges.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"private": false,
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
"scripts": {
|
|
81
81
|
"build:cli": "tsc -p tsconfig.json && chmod +x dist/cli/agent-config.js",
|
|
82
82
|
"build:install-bundle": "esbuild src/scripts/install.ts --bundle --platform=node --format=esm --target=node20 --define:__AGENT_CONFIG_BUNDLE__=true --outfile=dist/install/install.mjs --banner:js=\"import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);\"",
|
|
83
|
-
"build:hooks": "esbuild src/scripts/hooks/dispatch_entry.ts --bundle --platform=node --format=esm --target=node20 --define:__AGENT_CONFIG_BUNDLE__=true --outfile=dist/hooks/dispatch.js --banner:js=\"import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url); const __acPath = require('node:path'); const __acFs = require('node:fs'); const __acUrl = require('node:url'); const __acReal = (p) => { try { return __acFs.realpathSync(p); } catch { return p; } }; const __acSelf = __acReal(__acUrl.fileURLToPath(import.meta.url)); if (process.argv[1] !== undefined && __acReal(__acPath.resolve(process.argv[1])) === __acSelf) { globalThis.__AC_HOOKS_BUNDLE_DIRECT = true; process.argv = [process.argv[0], __acSelf + '.__direct__', ...process.argv.slice(2)]; }\"",
|
|
83
|
+
"build:hooks": "esbuild src/scripts/hooks/dispatch_entry.ts --bundle --platform=node --format=esm --target=node20 --define:__AGENT_CONFIG_BUNDLE__=true --outfile=dist/hooks/dispatch.js --banner:js=\"import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url); const __acPath = require('node:path'); const __acFs = require('node:fs'); const __acUrl = require('node:url'); const __acReal = (p) => { try { return __acFs.realpathSync(p); } catch { return p; } }; const __acSelf = __acReal(__acUrl.fileURLToPath(import.meta.url)); if (process.argv[1] !== undefined && __acReal(__acPath.resolve(process.argv[1])) === __acSelf) { globalThis.__AC_HOOKS_BUNDLE_DIRECT = true; process.argv = [process.argv[0], __acSelf + '.__direct__', ...process.argv.slice(2)]; }\" && node src/scripts/write_bundle_digest.mjs",
|
|
84
84
|
"build:mcp-bundle": "esbuild src/scripts/mcp_server/__main__.ts --bundle --platform=node --format=esm --target=node20 --define:__AGENT_CONFIG_BUNDLE__=true --outfile=dist/mcp/server.mjs --banner:js=\"import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url); const __acPath = require('node:path'); const __acFs = require('node:fs'); const __acUrl = require('node:url'); const __acReal = (p) => { try { return __acFs.realpathSync(p); } catch { return p; } }; const __acSelf = __acReal(__acUrl.fileURLToPath(import.meta.url)); if (process.argv[1] !== undefined && __acReal(__acPath.resolve(process.argv[1])) === __acSelf) { globalThis.__AC_MCP_BUNDLE_DIRECT = true; process.argv = [process.argv[0], __acSelf + '.__direct__', ...process.argv.slice(2)]; }\"",
|
|
85
85
|
"clean:cli-delegate": "rm -rf dist/cli-delegate",
|
|
86
86
|
"build:delegates": "npm run clean:cli-delegate && npm run build:cli-delegate && npm run build:agent-src-delegate && npm run build:delegate-aux",
|
|
@@ -122,8 +122,8 @@
|
|
|
122
122
|
"tree-sitter-wasms": "0.1.13",
|
|
123
123
|
"tsx": "^4.23.1",
|
|
124
124
|
"typescript": "^5.9.3",
|
|
125
|
-
"vite": "^
|
|
126
|
-
"vitest": "^
|
|
125
|
+
"vite": "^8.3.1",
|
|
126
|
+
"vitest": "^5.0.2"
|
|
127
127
|
},
|
|
128
128
|
"dependencies": {
|
|
129
129
|
"@fastify/static": "^10.1.2",
|
|
@@ -78,6 +78,41 @@ export const VOLATILE_KEYS: ReadonlyArray<string> = [
|
|
|
78
78
|
/** Why the loop stopped, or that it has budget left. */
|
|
79
79
|
export type SelfFixKind = 'retry' | 'exhausted' | 'no_progress';
|
|
80
80
|
|
|
81
|
+
/**
|
|
82
|
+
* `SelfFixKind` in the vocabulary a reader can aggregate across surfaces.
|
|
83
|
+
*
|
|
84
|
+
* `Outcome.PARTIAL` says the loop stopped without a green; it cannot say
|
|
85
|
+
* whether the budget ran out or the target stopped moving, and those want
|
|
86
|
+
* different responses — a bigger budget against the first, a different
|
|
87
|
+
* approach against the second. Until now the distinction left this module only
|
|
88
|
+
* inside a free-text `message`, so the continuation hook's stops were
|
|
89
|
+
* countable and this loop's were not.
|
|
90
|
+
*
|
|
91
|
+
* The two values are members of `RunTerminalState`, whose authoritative
|
|
92
|
+
* declaration is `src/scripts/_lib/outcome_vocabularies.ts:RUN_TERMINAL_STATES`
|
|
93
|
+
* and whose prose home is `contexts/execution/terminal-states.md`. They are
|
|
94
|
+
* written as literals rather than imported because this file is a TEMPLATE:
|
|
95
|
+
* it ships into consumer projects that have no `src/scripts/_lib` to import
|
|
96
|
+
* from, and reaching across that boundary would break every install. It is a
|
|
97
|
+
* two-member projection across a packaging boundary, not a second vocabulary —
|
|
98
|
+
* nothing here may add a member the registry does not have.
|
|
99
|
+
*/
|
|
100
|
+
export const RUN_TERMINAL_BY_KIND: Readonly<Record<Exclude<SelfFixKind, 'retry'>, string>> = {
|
|
101
|
+
exhausted: 'exhausted',
|
|
102
|
+
no_progress: 'stagnated',
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* The run-terminal value for a decision, or `null` while the loop is still live.
|
|
107
|
+
*
|
|
108
|
+
* `retry` has no terminal by construction — the loop has not stopped — and the
|
|
109
|
+
* null is returned rather than defaulted so a caller cannot accidentally stamp
|
|
110
|
+
* a terminal value onto a run that is still going.
|
|
111
|
+
*/
|
|
112
|
+
export function run_terminal_for(kind: SelfFixKind): string | null {
|
|
113
|
+
return kind === 'retry' ? null : RUN_TERMINAL_BY_KIND[kind];
|
|
114
|
+
}
|
|
115
|
+
|
|
81
116
|
/** Verdict of {@link decide} — pure, so the caller owns every mutation. */
|
|
82
117
|
export interface SelfFixDecision {
|
|
83
118
|
kind: SelfFixKind;
|
|
@@ -147,6 +182,27 @@ export function record_attempt(state: DeliveryState, lane: string, signature: st
|
|
|
147
182
|
state.self_fix = container;
|
|
148
183
|
}
|
|
149
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Stamp the lane's run-terminal value onto `state.self_fix`.
|
|
187
|
+
*
|
|
188
|
+
* Written into the state the module already owns and the dispatcher already
|
|
189
|
+
* persists, rather than onto `StepResult` — `StepResult` carries `outcome`,
|
|
190
|
+
* `questions` and `message` and is shared by every directive in the engine, so
|
|
191
|
+
* widening it for one loop's stop reason would be a change to all of them.
|
|
192
|
+
*
|
|
193
|
+
* A `retry` decision writes nothing: the loop has not stopped, and a terminal
|
|
194
|
+
* value recorded mid-loop would be read as one by anything aggregating the
|
|
195
|
+
* field.
|
|
196
|
+
*/
|
|
197
|
+
export function record_run_terminal(state: DeliveryState, lane: string, decision: SelfFixDecision): void {
|
|
198
|
+
const run_terminal = run_terminal_for(decision.kind);
|
|
199
|
+
if (run_terminal === null) return;
|
|
200
|
+
const container = _pyTruthy(state.self_fix) ? (state.self_fix as Record<string, Any>) : {};
|
|
201
|
+
const lane_state = _lane_state(state, lane);
|
|
202
|
+
container[lane] = { ...lane_state, run_terminal };
|
|
203
|
+
state.self_fix = container;
|
|
204
|
+
}
|
|
205
|
+
|
|
150
206
|
/** DoD entries the agent has not recorded as proven. Never inferred. */
|
|
151
207
|
export function unmet_dod(state: DeliveryState): Array<Record<string, Any>> {
|
|
152
208
|
const dod = (state.ticket ?? {})['dod'];
|
|
@@ -213,8 +269,11 @@ export function partial_exit(args: {
|
|
|
213
269
|
decision: SelfFixDecision;
|
|
214
270
|
unmet: Array<Record<string, Any>>;
|
|
215
271
|
rerun_directive: string;
|
|
272
|
+
/** Written the run-terminal value onto, when the caller has the state in hand. */
|
|
273
|
+
state?: DeliveryState;
|
|
216
274
|
}): StepResult {
|
|
217
|
-
const { lane, ticket_id, verdict, decision, unmet, rerun_directive } = args;
|
|
275
|
+
const { lane, ticket_id, verdict, decision, unmet, rerun_directive, state } = args;
|
|
276
|
+
if (state !== undefined) record_run_terminal(state, lane, decision);
|
|
218
277
|
const reason =
|
|
219
278
|
decision.kind === 'no_progress'
|
|
220
279
|
? `two consecutive attempts produced an identical \`${lane}\` verdict, ` +
|
|
@@ -244,7 +303,8 @@ export function partial_exit(args: {
|
|
|
244
303
|
],
|
|
245
304
|
message:
|
|
246
305
|
`Ticket ${ticket_id} ${lane} verdict is \`${String(verdict)}\` after ` +
|
|
247
|
-
`${decision.attempts} self-fix attempt(s) (${decision.kind}); exiting PARTIAL
|
|
306
|
+
`${decision.attempts} self-fix attempt(s) (${decision.kind}); exiting PARTIAL ` +
|
|
307
|
+
`(run_terminal: ${String(run_terminal_for(decision.kind))}).`,
|
|
248
308
|
});
|
|
249
309
|
}
|
|
250
310
|
|
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
*
|
|
12
12
|
* The gate is **scoped to the greenfield-scaffold path only**. It acts only
|
|
13
13
|
* when `state.ui_audit` records `greenfield == True` and
|
|
14
|
-
* `greenfield_decision
|
|
15
|
-
* clean `SUCCESS` no-op, so those flows stay
|
|
14
|
+
* `greenfield_decision` ∈ `{scaffold, granularity_convention}`. Every other
|
|
15
|
+
* UI flow sees this slot as a clean `SUCCESS` no-op, so those flows stay
|
|
16
|
+
* byte-identical.
|
|
16
17
|
*/
|
|
17
18
|
import {
|
|
18
19
|
type Any,
|
|
@@ -21,6 +22,7 @@ import {
|
|
|
21
22
|
StepResult,
|
|
22
23
|
agent_directive,
|
|
23
24
|
} from '../../delivery_state.js';
|
|
25
|
+
import { GRANULARITY_CONVENTION } from '../../state.js';
|
|
24
26
|
|
|
25
27
|
/** Declared ambiguity surfaces for this step. */
|
|
26
28
|
export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
|
|
@@ -112,14 +114,18 @@ export function run(state: DeliveryState): StepResult {
|
|
|
112
114
|
* The gate is inert for every other flow: improve-existing, the `bare` /
|
|
113
115
|
* `external_reference` greenfield picks, and the `diff` / `file` envelopes all
|
|
114
116
|
* leave `ui_audit` without the `greenfield == True` +
|
|
115
|
-
* `greenfield_decision
|
|
117
|
+
* `greenfield_decision` ∈ `{scaffold, granularity_convention}` pair.
|
|
116
118
|
*/
|
|
117
119
|
function _is_greenfield_scaffold(state: DeliveryState): boolean {
|
|
118
120
|
const audit = state.ui_audit;
|
|
119
121
|
if (!_isDict(audit)) return false;
|
|
122
|
+
// `granularity_convention` is option 4 — a scaffold that additionally
|
|
123
|
+
// organises what it creates under a named convention, so it takes the same
|
|
124
|
+
// grounding pass. Kept in step with the identical guard in `scaffold`.
|
|
120
125
|
return (
|
|
121
126
|
audit['greenfield'] === true &&
|
|
122
|
-
audit['greenfield_decision'] === 'scaffold'
|
|
127
|
+
(audit['greenfield_decision'] === 'scaffold' ||
|
|
128
|
+
audit['greenfield_decision'] === GRANULARITY_CONVENTION)
|
|
123
129
|
);
|
|
124
130
|
}
|
|
125
131
|
|