@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
|
@@ -152,10 +152,9 @@ import {
|
|
|
152
152
|
sessionRefusalFile,
|
|
153
153
|
} from '../_lib/turn_end_refusals.js';
|
|
154
154
|
import { phaseLines } from '../_lib/roadmap_checkboxes.js';
|
|
155
|
+
import { commandBearing, renderVerifyLine, type VerifyClause } from '../_lib/verify_clause.js';
|
|
155
156
|
|
|
156
|
-
const EXIT_ALLOW = 0;
|
|
157
157
|
/** Dispatcher-internal block code; the dispatcher maps stop-slot 1 → host 2. */
|
|
158
|
-
const EXIT_BLOCK = 1;
|
|
159
158
|
|
|
160
159
|
/**
|
|
161
160
|
* The gate's cap, IMPORTED rather than restated — the two must agree by
|
|
@@ -185,6 +184,7 @@ import { premiseMoved, readContextObservation } from '../_lib/context_observatio
|
|
|
185
184
|
import { RUN_TERMINAL_VOCABULARY_VERSION } from '../_lib/outcome_vocabularies.js';
|
|
186
185
|
import {
|
|
187
186
|
HALT_ACTIONS,
|
|
187
|
+
buildLedgerEvent, parseDeliveryState, type DeliveryState,
|
|
188
188
|
ladder,
|
|
189
189
|
MAX_ITERATIONS,
|
|
190
190
|
parseHaltStamp,
|
|
@@ -193,6 +193,7 @@ import {
|
|
|
193
193
|
WALL_CLOCK_CAP_MS,
|
|
194
194
|
type LadderAction,
|
|
195
195
|
} from '../_lib/continuation_ladder.js';
|
|
196
|
+
import { EXIT_ALLOW, EXIT_BLOCK } from './exit_codes.js';
|
|
196
197
|
|
|
197
198
|
/**
|
|
198
199
|
* DECLARED in `_lib/continuation_ladder.ts`, re-exported here: one declaration,
|
|
@@ -322,6 +323,8 @@ export interface RunState {
|
|
|
322
323
|
* observed one, which is never a disagreement (`premiseMoved`).
|
|
323
324
|
*/
|
|
324
325
|
context_fingerprint?: string;
|
|
326
|
+
/** DELIVERY position (8.1), written by the run; absent is no hold. */
|
|
327
|
+
delivery?: DeliveryState;
|
|
325
328
|
}
|
|
326
329
|
|
|
327
330
|
/**
|
|
@@ -372,8 +375,8 @@ export function isDuplicateFire(
|
|
|
372
375
|
export interface NextStep {
|
|
373
376
|
/** The step's own line, checkbox stripped, truncated for the message. */
|
|
374
377
|
text: string;
|
|
375
|
-
/** The step's `verify:`
|
|
376
|
-
verify:
|
|
378
|
+
/** The step's `verify:` clause — command plus optional expectation. */
|
|
379
|
+
verify: VerifyClause | null;
|
|
377
380
|
}
|
|
378
381
|
|
|
379
382
|
export interface ScanResult {
|
|
@@ -478,15 +481,15 @@ export function scanOpenSteps(text: string): ScanResult {
|
|
|
478
481
|
* The comment form wins when both are present: it is the machine-readable one,
|
|
479
482
|
* and a step carrying both has a human-facing line and a tooling-facing line
|
|
480
483
|
* rather than two commands.
|
|
484
|
+
*
|
|
485
|
+
* The hook's narrowing only — a prose clause is not a command, and the
|
|
486
|
+
* continuation message renders commands. It parses nothing itself: a second
|
|
487
|
+
* copy of the arrow grammar is how this hook and `closure_scan` would drift,
|
|
488
|
+
* and a drifted grammar stops reading expectations without failing anything.
|
|
489
|
+
* `_lib/verify_clause.ts` owns the grammar and the sweep that keeps it single.
|
|
481
490
|
*/
|
|
482
|
-
export function extractVerify(stepText: string):
|
|
483
|
-
|
|
484
|
-
if (html !== null) return (html[1] as string).trim() || null;
|
|
485
|
-
// `verify:` then the command, both backticked. The label's own backticks
|
|
486
|
-
// are optional because the tree carries `verify:` and `` `verify:` ``.
|
|
487
|
-
const backticked = /`?verify:`?\s*`([^`]+)`/.exec(stepText);
|
|
488
|
-
if (backticked !== null) return (backticked[1] as string).trim() || null;
|
|
489
|
-
return null;
|
|
491
|
+
export function extractVerify(stepText: string): VerifyClause | null {
|
|
492
|
+
return commandBearing(stepText);
|
|
490
493
|
}
|
|
491
494
|
|
|
492
495
|
/**
|
|
@@ -651,6 +654,10 @@ function readState(file: string): RunState | null {
|
|
|
651
654
|
if (o['inert_reported'] === true) {
|
|
652
655
|
rec.inert_reported = true;
|
|
653
656
|
}
|
|
657
|
+
// Round-tripped for the same reason `history_source` is: without this the
|
|
658
|
+
// 8.1 hold is dead code that reads as shipped.
|
|
659
|
+
const dlv = parseDeliveryState(o['delivery']);
|
|
660
|
+
if (dlv !== undefined) rec.delivery = dlv;
|
|
654
661
|
// Round-tripped for the same reason `history_source` is: dropped, the
|
|
655
662
|
// premise would be re-recorded every fire from the newest observation, so
|
|
656
663
|
// the two sides could never differ and the rung would be dead code.
|
|
@@ -1252,7 +1259,6 @@ export function main(): number {
|
|
|
1252
1259
|
return EXIT_ALLOW;
|
|
1253
1260
|
}
|
|
1254
1261
|
|
|
1255
|
-
|
|
1256
1262
|
// The two-tree provenance, carried on every event this run emits. See
|
|
1257
1263
|
// `provenance()` for the six fields and why none of them is a boolean.
|
|
1258
1264
|
//
|
|
@@ -1384,14 +1390,14 @@ export function main(): number {
|
|
|
1384
1390
|
const observed = readContextObservation(workspaceRoot)?.fingerprint ?? null;
|
|
1385
1391
|
const premiseInvalidated = premiseMoved(state.context_fingerprint, observed);
|
|
1386
1392
|
|
|
1393
|
+
const delivery = parseDeliveryState(state.delivery) ?? null;
|
|
1387
1394
|
const action = ladder(
|
|
1388
|
-
state,
|
|
1389
|
-
scan.open,
|
|
1390
|
-
Date.now(),
|
|
1395
|
+
state, scan.open, Date.now(),
|
|
1391
1396
|
scan.blocked,
|
|
1392
1397
|
undefined,
|
|
1393
1398
|
unavailable,
|
|
1394
1399
|
premiseInvalidated,
|
|
1400
|
+
delivery,
|
|
1395
1401
|
);
|
|
1396
1402
|
|
|
1397
1403
|
if (action !== 'engage') {
|
|
@@ -1408,23 +1414,13 @@ export function main(): number {
|
|
|
1408
1414
|
const alreadyBlocked =
|
|
1409
1415
|
action === 'blocked' && eventAlreadyLogged(workspaceRoot, runId, slug, 'blocked');
|
|
1410
1416
|
if (!alreadyStamped && !alreadyBlocked) {
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
blocked: scan.blocked,
|
|
1419
|
-
// A ledger line is a persisted shape carrying a `RunTerminalState`,
|
|
1420
|
-
// so it names the vocabulary version it was written against: a
|
|
1421
|
-
// reader meeting an unknown value can then tell a newer writer
|
|
1422
|
-
// from a corrupt row.
|
|
1423
|
-
terminal_state: terminalStateFor(action),
|
|
1424
|
-
terminal_vocabulary_version: RUN_TERMINAL_VOCABULARY_VERSION,
|
|
1425
|
-
at: new Date().toISOString(),
|
|
1426
|
-
...roots,
|
|
1427
|
-
});
|
|
1417
|
+
const line = buildLedgerEvent(
|
|
1418
|
+
{ action, runId, slug, turn: turnOrdinal, iterations: state.iterations,
|
|
1419
|
+
open: scan.open, blocked: scan.blocked, delivery },
|
|
1420
|
+
RUN_TERMINAL_VOCABULARY_VERSION,
|
|
1421
|
+
new Date(),
|
|
1422
|
+
);
|
|
1423
|
+
appendEvent(workspaceRoot, { ...line, ...roots } as JsonObject);
|
|
1428
1424
|
}
|
|
1429
1425
|
if (action === 'complete') {
|
|
1430
1426
|
// Only a COMPLETION clears the state, so a later run on the same
|
|
@@ -1490,8 +1486,7 @@ export function main(): number {
|
|
|
1490
1486
|
|
|
1491
1487
|
function _continuationText(slug: string, scan: ScanResult, iteration: number): string {
|
|
1492
1488
|
const stepLine = scan.next
|
|
1493
|
-
? `Next step: ${scan.next.text}`
|
|
1494
|
-
(scan.next.verify ? `\n verify: ${scan.next.verify}` : '')
|
|
1489
|
+
? `Next step: ${scan.next.text}${renderVerifyLine(scan.next.verify)}`
|
|
1495
1490
|
: 'Next step: (first open checkbox in the roadmap)';
|
|
1496
1491
|
return (
|
|
1497
1492
|
`run-continuation: the contracted roadmap \`${slug}\` has ${scan.open} open ` +
|
|
@@ -143,10 +143,9 @@ import { isSyntheticPrompt } from "../_lib/prompt_shape.js";
|
|
|
143
143
|
import { OBSERVATION_LOG, readObservationLog, resolveSkillCatalogueRoots } from "../_lib/skill_catalogue.js";
|
|
144
144
|
import { knownBareNames } from "../_lib/skill_catalogue_series.js";
|
|
145
145
|
import { _tokenize, rank, type RankRow } from "../skill_tools/score_skill_relevance.js";
|
|
146
|
+
import { EXIT_ALLOW, EXIT_WARN } from './exit_codes.js';
|
|
146
147
|
|
|
147
|
-
const EXIT_ALLOW = 0;
|
|
148
148
|
/** See the header: reduced to a real exit of 0 by `emitFor`'s warn branch. */
|
|
149
|
-
const EXIT_WARN = 2;
|
|
150
149
|
|
|
151
150
|
/**
|
|
152
151
|
* Minimum top-1 ranker score before this concern speaks.
|
|
@@ -95,8 +95,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
95
95
|
import { is_replay_mode } from './state_io.js';
|
|
96
96
|
import { readHookStdin } from './hook_stdin.js';
|
|
97
97
|
import { resolveConsumerRoot } from './subagent_ledger_hook.js';
|
|
98
|
-
|
|
99
|
-
const EXIT_ALLOW = 0;
|
|
98
|
+
import { EXIT_ALLOW } from './exit_codes.js';
|
|
100
99
|
|
|
101
100
|
/** Would-warns per session before the valve goes silent — `MAX_NUDGES` shape. */
|
|
102
101
|
export const MAX_SHADOW_WARNS = 2;
|
|
@@ -55,8 +55,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
55
55
|
|
|
56
56
|
import { appendLedgerLine, openRecordStats, resolveConsumerRoot } from './subagent_ledger_hook.js';
|
|
57
57
|
import { readHookStdin } from './hook_stdin.js';
|
|
58
|
-
|
|
59
|
-
const EXIT_ALLOW = 0;
|
|
58
|
+
import { EXIT_ALLOW } from './exit_codes.js';
|
|
60
59
|
|
|
61
60
|
type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
|
|
62
61
|
type JsonObject = { [k: string]: JsonValue };
|
|
@@ -115,8 +115,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
115
115
|
import { countContractFields, validateResponse } from '../_lib/subagent_response.js';
|
|
116
116
|
import { atomic_write_json, is_replay_mode } from './state_io.js';
|
|
117
117
|
import { readHookStdin } from './hook_stdin.js';
|
|
118
|
-
|
|
119
|
-
const EXIT_ALLOW = 0;
|
|
118
|
+
import { EXIT_ALLOW } from './exit_codes.js';
|
|
120
119
|
|
|
121
120
|
type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
|
|
122
121
|
type JsonObject = { [k: string]: JsonValue };
|
|
@@ -51,8 +51,8 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
51
51
|
import { unwrap } from './envelope.js';
|
|
52
52
|
import { readHookStdin } from './hook_stdin.js';
|
|
53
53
|
import { humanTypedThisTurn } from '../_lib/machine_wake.js';
|
|
54
|
+
import { EXIT_ALLOW } from './exit_codes.js';
|
|
54
55
|
|
|
55
|
-
const EXIT_ALLOW = 0;
|
|
56
56
|
const SETTINGS_FILE = '.agent-settings.yml';
|
|
57
57
|
const SINK_REL = path.join('agents', 'runtime', 'state', 'audit', 'suggestion-capture.jsonl');
|
|
58
58
|
const LATCH_REL = path.join('agents', 'runtime', 'state', 'suggestion-latch.json');
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* table_fingerprint — the content fingerprint a compiled plumbing table is
|
|
5
|
+
* validated against.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from `dispatch_hook._manifest_fingerprint` so a SECOND table
|
|
8
|
+
* (`host_lowering.yaml`) can use the same helper without importing the
|
|
9
|
+
* dispatcher: `dispatch_hook` → `host_semantics` → `host_lowering` is a live
|
|
10
|
+
* import chain, so the reverse edge would be a cycle.
|
|
11
|
+
*
|
|
12
|
+
* DELIBERATELY CONTENT-DERIVED, NOT MTIME. The first version of the manifest
|
|
13
|
+
* fast path compared mtimes and that was a measured defect, not a theoretical
|
|
14
|
+
* one: on a fresh `actions/checkout` both files carry the checkout timestamp in
|
|
15
|
+
* whatever order git wrote them, so whether the optimisation applied at all was
|
|
16
|
+
* a coin flip — it won on a PR run (p95 129 ms) and lost on the trunk
|
|
17
|
+
* (p95 186 ms) for the same commit. A fingerprint is deterministic wherever the
|
|
18
|
+
* tree came from.
|
|
19
|
+
*
|
|
20
|
+
* SHA-256 over the UTF-8 bytes, plus the length. This replaced an FNV-1a loop
|
|
21
|
+
* in step 3.1 of `road-to-a-kernel-that-guards-its-plumbing`, and the reason
|
|
22
|
+
* the old one existed no longer holds. Its header said a cryptographic hash was
|
|
23
|
+
* refused because `require('node:crypto')` costs 8 ms of process start, which
|
|
24
|
+
* is most of what the precompiled table saves. Both halves were re-measured
|
|
25
|
+
* against the tree as it now stands, and both had gone stale:
|
|
26
|
+
*
|
|
27
|
+
* - The module is ALREADY LOADED. `dist/hooks/dispatch.js` carries 23
|
|
28
|
+
* top-level `import … from "node:crypto"` statements from other parts of the
|
|
29
|
+
* graph, so the 8 ms is paid on every dispatch whether this function uses it
|
|
30
|
+
* or not. There is no startup cost left to avoid.
|
|
31
|
+
* - SHA-256 is FASTER here, not slower: 0.106 ms against 0.113 ms over the
|
|
32
|
+
* 99,792-byte manifest, because Node's digest is native and the FNV-1a loop
|
|
33
|
+
* was 99,792 interpreted `charCodeAt` calls.
|
|
34
|
+
*
|
|
35
|
+
* The change is therefore free, and it buys the property the old comment had to
|
|
36
|
+
* disclaim: this now guards against a CRAFTED sibling as well as a stale one,
|
|
37
|
+
* which is what a file called a fingerprint should mean when the roadmap around
|
|
38
|
+
* it is about integrity.
|
|
39
|
+
*
|
|
40
|
+
* Producer and both consumers import THIS function — `compile_hook_manifest`
|
|
41
|
+
* writes the value, `dispatch_hook` and `host_lowering` check it — so the
|
|
42
|
+
* algorithm can never drift between the two sides. A mismatch is not a failure
|
|
43
|
+
* either way: the reader falls through to parsing the YAML source, which is
|
|
44
|
+
* correct and merely slower.
|
|
45
|
+
*/
|
|
46
|
+
export function tableFingerprint(text: string): string {
|
|
47
|
+
const digest = createHash('sha256').update(text, 'utf-8').digest('hex');
|
|
48
|
+
return `${digest}:${String(text.length)}`;
|
|
49
|
+
}
|
|
@@ -45,8 +45,7 @@ import {
|
|
|
45
45
|
import { is_replay_mode } from './state_io.js';
|
|
46
46
|
import { readHookStdin } from './hook_stdin.js';
|
|
47
47
|
import { _resolveRoot, readSettingsFor } from './telemetry_usage_hook.js';
|
|
48
|
-
|
|
49
|
-
const EXIT_ALLOW = 0;
|
|
48
|
+
import { EXIT_ALLOW } from './exit_codes.js';
|
|
50
49
|
|
|
51
50
|
/**
|
|
52
51
|
* Where `flush_sender.mjs` lives, relative to this module.
|
|
@@ -57,8 +57,7 @@ import {
|
|
|
57
57
|
} from '../../agent-src/templates/scripts/telemetry/transport.js';
|
|
58
58
|
import { is_replay_mode } from './state_io.js';
|
|
59
59
|
import { readHookStdin } from './hook_stdin.js';
|
|
60
|
-
|
|
61
|
-
const EXIT_ALLOW = 0;
|
|
60
|
+
import { EXIT_ALLOW } from './exit_codes.js';
|
|
62
61
|
|
|
63
62
|
/** The tool name Phase 0 spike 1 confirmed for a skill invocation. */
|
|
64
63
|
export const SKILL_TOOL_NAME = 'Skill';
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
*
|
|
25
25
|
* PRIVACY BY CONSTRUCTION — never widen this file to record content.
|
|
26
26
|
*
|
|
27
|
-
* The record type has exactly
|
|
27
|
+
* The record type has exactly four fields and NONE of them can hold free
|
|
28
28
|
* text: a timestamp, a tool NAME (an id-shaped enum — `Read`, `Bash`,
|
|
29
29
|
* `Grep` — the same single host string `orchestration_record_hook` already
|
|
30
|
-
* records), and
|
|
30
|
+
* records), and TWO BYTE COUNTS. A tool result routinely carries file
|
|
31
31
|
* contents, command output, secrets in an env dump, and customer data from
|
|
32
32
|
* an API response. None of it reaches this file's output, because the
|
|
33
33
|
* output has no field able to carry it. A record shape that cannot hold a
|
|
@@ -47,6 +47,34 @@
|
|
|
47
47
|
* identical while the cost came back. The `RESULT_KEYS` literals below are the
|
|
48
48
|
* key NAMES this concern looks under, not a read of the body.
|
|
49
49
|
*
|
|
50
|
+
* TWO COUNTS, ONE OF THEM REDUNDANT TODAY. `raw_bytes` is what
|
|
51
|
+
* the host handed the dispatcher; `delivered_bytes` is what reached the
|
|
52
|
+
* model. Today they are EQUAL BY CONSTRUCTION, and the construction is
|
|
53
|
+
* checkable: nothing under `src/` or `docs/` emits the host's result-rewrite
|
|
54
|
+
* field, so no concern can rewrite a tool result on its way past. That
|
|
55
|
+
* absence is a grep, and the grep lives in this concern's test rather than
|
|
56
|
+
* in this sentence - a claim in a comment is not falsifiable, and naming the
|
|
57
|
+
* field here would put a match in the very tree the grep sweeps.
|
|
58
|
+
*
|
|
59
|
+
* Recording both NOW is what makes a later reduction measurable instead of
|
|
60
|
+
* asserted. With one field, a future release that starts trimming results
|
|
61
|
+
* has no before-number and can only claim an improvement; with two, the
|
|
62
|
+
* delta is in the census the day the trimming lands. The cost of the second
|
|
63
|
+
* field is one integer per line in one workspace — see the gate below.
|
|
64
|
+
*
|
|
65
|
+
* DEFAULT OFF OUTSIDE THE MAINTAINER WORKSPACE. A byte counter on every
|
|
66
|
+
* tool call in every consumer install is
|
|
67
|
+
* the cheapest possible way to add a second unread instrument: it costs a
|
|
68
|
+
* write per tool call, accumulates volume, and answers a question only this
|
|
69
|
+
* package's maintainers have asked. So {@link resolvesMaintainerWorkspace}
|
|
70
|
+
* gates the write, and with no maintainer workspace resolved a dispatch
|
|
71
|
+
* writes nothing at all — not an empty line, not a file.
|
|
72
|
+
*
|
|
73
|
+
* A consumer who WANTS the census sets `AGENT_CONFIG_TOOL_BYTE_CENSUS=1`.
|
|
74
|
+
* That is a deliberate opt-in and it is the only other way the write
|
|
75
|
+
* happens; there is no settings key, because a key would put the decision in
|
|
76
|
+
* a file this concern would then have to parse on the hot path.
|
|
77
|
+
*
|
|
50
78
|
* ── Always exit 0 ─────────────────────────────────────────────────────
|
|
51
79
|
*
|
|
52
80
|
* A `warn` (exit 2) is read as a hard BLOCK on this host, and this concern
|
|
@@ -56,8 +84,8 @@
|
|
|
56
84
|
*
|
|
57
85
|
* ── Absence is recorded, not inferred ─────────────────────────────────
|
|
58
86
|
*
|
|
59
|
-
* A payload carrying no readable result writes a line with
|
|
60
|
-
* and `measurable: false` rather than writing nothing. The two cases are
|
|
87
|
+
* A payload carrying no readable result writes a line with both byte fields
|
|
88
|
+
* null and `measurable: false` rather than writing nothing. The two cases are
|
|
61
89
|
* otherwise byte-identical in the output — "this host does not carry tool
|
|
62
90
|
* results in its PostToolUse payload" and "no tools ran" would produce the
|
|
63
91
|
* same empty file, and the first is a finding about the instrument's own
|
|
@@ -72,8 +100,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
72
100
|
import { is_replay_mode } from './state_io.js';
|
|
73
101
|
import { readHookStdin } from './hook_stdin.js';
|
|
74
102
|
import { stubbedBytes } from './payload_stub.js';
|
|
75
|
-
|
|
76
|
-
const EXIT_ALLOW = 0;
|
|
103
|
+
import { EXIT_ALLOW } from './exit_codes.js';
|
|
77
104
|
|
|
78
105
|
type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
|
|
79
106
|
type JsonObject = { [k: string]: JsonValue };
|
|
@@ -85,7 +112,7 @@ function isObject(v: unknown): v is JsonObject {
|
|
|
85
112
|
/**
|
|
86
113
|
* Census file, relative to the consumer repo root. Sibling of
|
|
87
114
|
* `injection-census.jsonl` in the same directory and the same
|
|
88
|
-
* `{ts, …, bytes}` line
|
|
115
|
+
* `{ts, …, bytes}` line family — one family, two units: that file counts
|
|
89
116
|
* bytes this suite injects, this one counts bytes the host's tools do.
|
|
90
117
|
* Gitignored via `/agents/runtime/`.
|
|
91
118
|
*/
|
|
@@ -169,13 +196,65 @@ function censusFile(consumerRoot: string): string {
|
|
|
169
196
|
export interface CensusLine {
|
|
170
197
|
ts: string;
|
|
171
198
|
tool: string | null;
|
|
172
|
-
bytes
|
|
199
|
+
/** UTF-8 bytes the host handed the dispatcher. `null` ⇒ unmeasurable. */
|
|
200
|
+
raw_bytes: number | null;
|
|
201
|
+
/**
|
|
202
|
+
* UTF-8 bytes that reached the model.
|
|
203
|
+
*
|
|
204
|
+
* Equal to {@link CensusLine.raw_bytes} by construction today — nothing in
|
|
205
|
+
* this tree rewrites a tool result. It is recorded anyway so that a later
|
|
206
|
+
* reduction is a measured delta rather than a claim. See the header.
|
|
207
|
+
*/
|
|
208
|
+
delivered_bytes: number | null;
|
|
173
209
|
/** `false` ⇒ the payload carried no readable result. See the header. */
|
|
174
210
|
measurable: boolean;
|
|
175
211
|
}
|
|
176
212
|
|
|
213
|
+
/** `package.json.name` of the workspace this census is for. */
|
|
214
|
+
export const MAINTAINER_PACKAGE_NAME = '@event4u/agent-config';
|
|
215
|
+
|
|
216
|
+
/** Deliberate consumer opt-in. Any other value, or unset, leaves the census off. */
|
|
217
|
+
export const CENSUS_OPT_IN_ENV = 'AGENT_CONFIG_TOOL_BYTE_CENSUS';
|
|
218
|
+
|
|
219
|
+
/** Memoised per root: this is read once per dispatched tool call otherwise. */
|
|
220
|
+
const _maintainerCache = new Map<string, boolean>();
|
|
221
|
+
|
|
222
|
+
/** Test seam — the cache would otherwise outlive a fixture root's contents. */
|
|
223
|
+
export function _resetMaintainerCache(): void {
|
|
224
|
+
_maintainerCache.clear();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Does this root resolve the maintainer workspace?
|
|
229
|
+
*
|
|
230
|
+
* Read off `package.json.name`, which is the cheapest unambiguous marker of
|
|
231
|
+
* the one workspace whose `workspaces: [agent-config-maintainer]` artefacts
|
|
232
|
+
* are active. A settings key was rejected: it would put a YAML parse on the
|
|
233
|
+
* post_tool_use path for a decision that never changes within a checkout.
|
|
234
|
+
*
|
|
235
|
+
* Any failure — no `package.json`, unreadable, unparseable, a different name
|
|
236
|
+
* — resolves to FALSE. The default is silence, which is the safe direction
|
|
237
|
+
* for an instrument nobody in that workspace is going to read.
|
|
238
|
+
*/
|
|
239
|
+
export function resolvesMaintainerWorkspace(consumerRoot: string): boolean {
|
|
240
|
+
if (process.env[CENSUS_OPT_IN_ENV] === '1') return true;
|
|
241
|
+
const cached = _maintainerCache.get(consumerRoot);
|
|
242
|
+
if (cached !== undefined) return cached;
|
|
243
|
+
let verdict = false;
|
|
244
|
+
try {
|
|
245
|
+
const raw = fs.readFileSync(path.join(consumerRoot, 'package.json'), 'utf8');
|
|
246
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
247
|
+
verdict = isObject(parsed) && parsed['name'] === MAINTAINER_PACKAGE_NAME;
|
|
248
|
+
} catch {
|
|
249
|
+
verdict = false;
|
|
250
|
+
}
|
|
251
|
+
_maintainerCache.set(consumerRoot, verdict);
|
|
252
|
+
return verdict;
|
|
253
|
+
}
|
|
254
|
+
|
|
177
255
|
export function _appendCensusLine(consumerRoot: string, line: CensusLine): void {
|
|
178
256
|
if (is_replay_mode()) return;
|
|
257
|
+
if (!resolvesMaintainerWorkspace(consumerRoot)) return;
|
|
179
258
|
const file = censusFile(consumerRoot);
|
|
180
259
|
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
181
260
|
fs.appendFileSync(file, `${JSON.stringify(line)}\n`, 'utf8');
|
|
@@ -193,7 +272,12 @@ export function processEnvelope(envelope: JsonValue, consumerRoot: string): numb
|
|
|
193
272
|
_appendCensusLine(consumerRoot, {
|
|
194
273
|
ts: new Date().toISOString(),
|
|
195
274
|
tool: _toolName(payload, envelope),
|
|
196
|
-
bytes,
|
|
275
|
+
raw_bytes: bytes,
|
|
276
|
+
// Equal BY CONSTRUCTION, not by copy-as-convenience: no concern
|
|
277
|
+
// can rewrite a result between the host and the model, because
|
|
278
|
+
// nothing under src/ or docs/ emits the host's rewrite field. The
|
|
279
|
+
// test pins that as a grep; naming the field here would match it.
|
|
280
|
+
delivered_bytes: bytes,
|
|
197
281
|
measurable: bytes !== null,
|
|
198
282
|
});
|
|
199
283
|
} catch {
|