@event4u/agent-config 14.12.0 → 14.13.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 +234 -0
- package/CONTRIBUTING.md +38 -0
- package/CREDITS.md +135 -0
- package/NOTICE +13 -0
- package/README.md +8 -6
- package/dist/agent-src/commands/analyze/inbox.md +109 -2
- package/dist/agent-src/commands/feature/dev.md +7 -2
- package/dist/agent-src/commands/ghostwriter/write.md +5 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/orchestrate.md +2 -2
- package/dist/agent-src/commands/post-as/me.md +5 -1
- package/dist/agent-src/commands/pr/merge.md +19 -6
- package/dist/agent-src/commands/roadmap/process-full.md +19 -5
- package/dist/agent-src/commands/tdd/red.md +12 -2
- package/dist/agent-src/commands/work.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +40 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +5 -2
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +21 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +1 -0
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +40 -0
- package/dist/agent-src/contexts/execution/subagent-steering.md +13 -1
- package/dist/agent-src/contexts/execution/terminal-states.md +96 -0
- package/dist/agent-src/rules/artifact-drafting-protocol.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -0
- package/dist/agent-src/rules/code-provenance.md +4 -0
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +4 -0
- package/dist/agent-src/rules/domain-safety-retention.md +4 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +14 -12
- package/dist/agent-src/rules/improve-before-implement.md +6 -8
- package/dist/agent-src/rules/laravel-routing.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +4 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +12 -34
- package/dist/agent-src/rules/symfony-routing.md +1 -1
- package/dist/agent-src/rules/token-efficiency.md +14 -0
- package/dist/agent-src/rules/tool-safety.md +4 -0
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/dist/agent-src/scripts/guarded_baseline.ts +328 -0
- package/dist/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/dist/agent-src/scripts/stub_queue.ts +82 -0
- package/dist/agent-src/scripts/stubs_due.ts +400 -0
- package/dist/agent-src/scripts/ticket_bundles.ts +84 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +17 -4
- package/dist/agent-src/skills/brand-audit/SKILL.md +33 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +57 -0
- package/dist/agent-src/skills/database/SKILL.md +8 -0
- package/dist/agent-src/skills/dependency-upgrade/SKILL.md +27 -0
- package/dist/agent-src/skills/design-review/SKILL.md +1 -1
- package/dist/agent-src/skills/doc-coauthoring/SKILL.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +17 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +9 -2
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +44 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +38 -4
- package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +2 -2
- package/dist/agent-src/skills/laravel/SKILL.md +35 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +57 -3
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +26 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +28 -1
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-writing/references/procedure.md +5 -5
- package/dist/agent-src/skills/sql-writing/SKILL.md +7 -1
- package/dist/agent-src/skills/standards-from-config/SKILL.md +27 -4
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +11 -4
- package/dist/agent-src/skills/symfony-workflow/SKILL.md +35 -0
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +85 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +33 -9
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +37 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +45 -2
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +38 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +9 -4
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +97 -3
- package/dist/agent-src/templates/scripts/check_memory.ts +258 -17
- package/dist/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/dist/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/dist/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/dist/cli/commands/uiAudit.js +124 -5
- package/dist/cli/registry.js +2 -0
- package/dist/cli-delegate/{chunk-HYWSRNUX.js → chunk-2DK2VJWG.js} +3 -3
- package/dist/cli-delegate/{chunk-JCW7ZLHK.js → chunk-4FS4WRXP.js} +5 -0
- package/dist/cli-delegate/{chunk-OMIVVCG2.js → chunk-A4QJ6ENT.js} +24 -0
- package/dist/cli-delegate/{chunk-JJA2QEWA.js → chunk-AKJGUQNO.js} +466 -285
- package/dist/cli-delegate/{chunk-E46KPN6K.js → chunk-BTWUYDGN.js} +424 -363
- package/dist/cli-delegate/{chunk-K4FFODTS.js → chunk-ILMUPLGW.js} +1227 -316
- package/dist/cli-delegate/{chunk-FF7WAFMR.js → chunk-KPBWFOPZ.js} +5 -1
- package/dist/cli-delegate/cmd_adr_effective.js +102 -0
- package/dist/cli-delegate/cmd_conformance.js +42 -10
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +3 -2
- package/dist/cli-delegate/cmd_fleet.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +3 -2
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +3 -2
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +3 -2
- package/dist/cli-delegate/cmd_uninstall.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +3 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +57 -57
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +1836 -712
- package/dist/install/claudeRuleRewrite.js +254 -0
- package/dist/install/detect.js +29 -16
- package/dist/install/detect_php_shape.js +159 -0
- package/dist/install/install.mjs +634 -428
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +3 -3
- package/dist/mcp/server.mjs +4818 -2645
- package/dist/server/schemas/settings.js +3 -0
- package/dist/ui/assets/index-D0jaCRPM.js +29 -0
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/THIRD-PARTY-NOTICES.md +25 -0
- package/docs/contracts/provider-lifecycle.md +1 -1
- package/docs/contracts/settings-classes.md +10 -4
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +1 -0
- package/docs/guidelines/agent-infra/artifact-drafting-protocol-mechanics.md +58 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/break-glass-usage.md +7 -7
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/comparison-matrix.md +1 -1
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +2 -2
- package/docs/guidelines/agent-infra/domain-eval-anti-pattern.md +1 -1
- package/docs/guidelines/agent-infra/engineering-memory-data-format.md +3 -3
- package/docs/guidelines/agent-infra/existence-question-verdicts.md +80 -0
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/framework-neutrality-patterns.md +2 -2
- package/docs/guidelines/agent-infra/guarded-baseline.md +39 -0
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/language-and-tone-examples.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +10 -10
- package/docs/guidelines/agent-infra/memory-access.md +1 -1
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/reuse-verdict-mechanics.md +71 -0
- package/docs/guidelines/agent-infra/review-routing-data-format.md +7 -7
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +13 -7
- package/docs/guidelines/agent-infra/role-contracts.md +2 -2
- package/docs/guidelines/agent-infra/role-mode-router.md +3 -3
- package/docs/guidelines/agent-infra/rule-type-governance.md +2 -2
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +6 -6
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +6 -6
- package/docs/guidelines/agent-infra/source-confidentiality-mechanics.md +109 -0
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +6 -4
- package/docs/guidelines/component-oriented-and-oop-development.md +3 -2
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/design-fidelity-mechanics.md +1 -1
- package/docs/guidelines/docs/readme-size-and-splitting.md +3 -3
- package/docs/guidelines/php/database.md +90 -7
- package/docs/guidelines/prompt-templates.md +7 -7
- package/llms.txt +2 -2
- package/package.json +5 -2
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +247 -3
- package/src/agent-src/scripts/guarded_baseline.ts +328 -0
- package/src/agent-src/scripts/roadmap_set_step.ts +253 -0
- package/src/agent-src/scripts/stub_queue.ts +82 -0
- package/src/agent-src/scripts/stubs_due.ts +400 -0
- package/src/agent-src/scripts/ticket_bundles.ts +84 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +8 -4
- package/src/agent-src/templates/scripts/check_memory.ts +258 -17
- package/src/agent-src/templates/scripts/check_memory_proposal.ts +9 -3
- package/src/agent-src/templates/scripts/memory_lookup.ts +86 -0
- package/src/agent-src/templates/scripts/memory_signal.ts +44 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/implement.ts +90 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/index.ts +11 -0
- package/src/agent-src/templates/scripts/work_engine/directives/backend/test.ts +23 -1
- package/src/agent-src/templates/scripts/work_engine/directives/backend/verify.ts +10 -1
- package/src/agent-src/templates/scripts/work_engine/directives/mixed/stitch.ts +5 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +102 -14
- package/src/config/agent-settings.template.yml +32 -3
- package/src/config/assurance-capability-registry.json +21 -9
- package/src/config/canonical-terms.yml +119 -0
- package/src/config/capability-native-outcome-bars.json +81 -0
- package/src/config/ci-local-parity.yml +80 -0
- package/src/config/drafting-channels.yml +43 -0
- package/src/config/estate-count-budget.json +38 -36
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +579 -63
- package/src/config/gate-reachability-exemptions.json +21 -0
- package/src/config/gate-violation-baselines.json +37 -19
- package/src/config/harness-evolution-budget.json +25 -0
- package/src/config/lapsed-beta-baseline.json +96 -0
- package/src/config/memory-twin-verdicts.yml +129 -0
- package/src/config/metric-registry.yml +124 -0
- package/src/config/pack-size-budget.json +16 -15
- package/src/config/preamble-payload-budget.json +8 -8
- package/src/config/profiles/balanced.ini +27 -0
- package/src/config/profiles/full.ini +27 -0
- package/src/config/profiles/minimal.ini +27 -0
- package/src/config/publish-surface.json +9 -2
- package/src/config/routing-coverage-seed.json +16 -2
- package/src/config/rule-stub-ceilings.json +126 -112
- package/src/config/turnaround-budget.json +66 -0
- package/src/install/claudeRuleRewrite.ts +288 -0
- package/src/install/detect.ts +60 -17
- package/src/install/detect_php_shape.ts +191 -0
- package/src/scripts/_cli/cmd_doctor.ts +27 -112
- package/src/scripts/_dispatch.bash +27 -0
- package/src/scripts/_lib/activation_ladder.ts +211 -0
- package/src/scripts/_lib/activation_states.ts +88 -0
- package/src/scripts/_lib/adherence_detectors.ts +143 -0
- package/src/scripts/_lib/arith_claims.ts +181 -0
- package/src/scripts/_lib/arm_ranking.ts +62 -0
- package/src/scripts/_lib/asset_delivery_ledger.ts +303 -0
- package/src/scripts/_lib/audit_field_provenance.ts +54 -0
- package/src/scripts/_lib/auto_dispatch.ts +32 -3
- package/src/scripts/_lib/bench_ab_size_claim.ts +98 -4
- package/src/scripts/_lib/benchmark_cache_fields.ts +158 -0
- package/src/scripts/_lib/candidate_proposer.ts +402 -0
- package/src/scripts/_lib/candidate_record.ts +601 -0
- package/src/scripts/_lib/capture_rate.ts +319 -0
- package/src/scripts/_lib/collector_denominator.ts +771 -0
- package/src/scripts/_lib/collector_record.ts +340 -0
- package/src/scripts/_lib/collector_store.ts +664 -0
- package/src/scripts/_lib/collector_supervision.ts +827 -0
- package/src/scripts/_lib/concern_estate.ts +77 -0
- package/src/scripts/_lib/config_chain.ts +477 -0
- package/src/scripts/_lib/config_cost.ts +209 -0
- package/src/scripts/_lib/council_settings_block.ts +6 -0
- package/src/scripts/_lib/curator_ops.ts +172 -0
- package/src/scripts/_lib/delivery_arm_experiment.ts +266 -0
- package/src/scripts/_lib/delivery_criticality.ts +126 -0
- package/src/scripts/_lib/doctor_runtime_checks.ts +70 -0
- package/src/scripts/_lib/empty_cycles.ts +88 -0
- package/src/scripts/_lib/eval_publication.ts +354 -0
- package/src/scripts/_lib/evaluation_vector.ts +283 -0
- package/src/scripts/_lib/evaluator_promotion.ts +225 -0
- package/src/scripts/_lib/evidence_basis.ts +118 -0
- package/src/scripts/_lib/exec_evidence.ts +8 -0
- package/src/scripts/_lib/experience_card.ts +272 -0
- package/src/scripts/_lib/experience_report.ts +151 -0
- package/src/scripts/_lib/experiment_freeze.ts +112 -0
- package/src/scripts/_lib/generated_by.ts +66 -0
- package/src/scripts/_lib/harness_evolution_guards.ts +229 -0
- package/src/scripts/_lib/hook_effect_probe.ts +141 -0
- package/src/scripts/_lib/host_denominator.ts +687 -0
- package/src/scripts/_lib/host_projection_reach.ts +157 -0
- package/src/scripts/_lib/ignored_blocker.ts +148 -0
- package/src/scripts/_lib/install_reach_checks.ts +495 -0
- package/src/scripts/_lib/json_duplicate_keys.ts +150 -0
- package/src/scripts/_lib/judge_hygiene.ts +228 -0
- package/src/scripts/_lib/legacy_boundary_map.ts +228 -0
- package/src/scripts/_lib/loop_guards.ts +299 -0
- package/src/scripts/_lib/loss_class.ts +129 -0
- package/src/scripts/_lib/machine_wake.ts +51 -0
- package/src/scripts/_lib/md_prose_lines.ts +177 -0
- package/src/scripts/_lib/minimality_tiebreak.ts +168 -0
- package/src/scripts/_lib/one_resolver_invariant.ts +449 -0
- package/src/scripts/_lib/orchestration_record.ts +253 -5
- package/src/scripts/_lib/outcome_envelope.ts +227 -0
- package/src/scripts/_lib/outcome_vocabularies.ts +125 -0
- package/src/scripts/_lib/paired_stats.ts +245 -0
- package/src/scripts/_lib/paired_verdict.ts +226 -0
- package/src/scripts/_lib/prefix_stable_surfaces.ts +123 -0
- package/src/scripts/_lib/privacy_class.ts +47 -0
- package/src/scripts/_lib/regression_neighbourhood.ts +259 -0
- package/src/scripts/_lib/repeated_failure.ts +105 -0
- package/src/scripts/_lib/repo_root.ts +111 -0
- package/src/scripts/_lib/review_skipped_record.ts +37 -0
- package/src/scripts/_lib/role_split.ts +338 -0
- package/src/scripts/_lib/runtime_journal.ts +1499 -0
- package/src/scripts/_lib/runtime_wiring_checks.ts +430 -0
- package/src/scripts/_lib/skill_catalogue.ts +11 -1
- package/src/scripts/_lib/source_digest.ts +200 -0
- package/src/scripts/_lib/source_redact.ts +260 -0
- package/src/scripts/_lib/source_shape.ts +502 -0
- package/src/scripts/_lib/source_snapshot_dedup.ts +199 -0
- package/src/scripts/_lib/strip_comments.d.mts +8 -0
- package/src/scripts/_lib/strip_comments.mjs +65 -0
- package/src/scripts/_lib/test_red_state.ts +154 -0
- package/src/scripts/_lib/trigger_shift.ts +144 -0
- package/src/scripts/_lib/untrusted_content.ts +82 -7
- package/src/scripts/adoption_report.ts +1 -1
- package/src/scripts/adr/evidence_census.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +26 -2
- package/src/scripts/adr_cite_check.ts +164 -1
- package/src/scripts/ai_council/blind_review.ts +11 -1
- package/src/scripts/ai_council/clients.ts +4 -0
- package/src/scripts/ai_council/config.ts +3 -0
- package/src/scripts/ai_council/consensus.ts +28 -8
- package/src/scripts/ai_council/consensus_round.ts +226 -0
- package/src/scripts/ai_council/disagreement_signal.ts +338 -0
- package/src/scripts/ai_council/inline_findings.ts +340 -0
- package/src/scripts/ai_council/judge_position_bias.ts +197 -0
- package/src/scripts/ai_council/orchestrator.ts +16 -203
- package/src/scripts/ai_council/orchestrator_results.ts +23 -3
- package/src/scripts/ai_council/pricing.ts +106 -0
- package/src/scripts/ai_council/prompts.ts +74 -7
- package/src/scripts/ai_council/provider_leakage_bench.ts +327 -0
- package/src/scripts/ai_council/py_format.ts +14 -3
- package/src/scripts/ai_council/recouncil_guard.ts +293 -0
- package/src/scripts/ai_council/response_record.ts +50 -0
- package/src/scripts/ai_council/topology_bench_manifest.ts +860 -0
- package/src/scripts/ai_council/topology_vocabulary.ts +175 -0
- package/src/scripts/asset_delivery_ledger.ts +157 -0
- package/src/scripts/attest_artifact.ts +193 -0
- package/src/scripts/audit_auto_rules.ts +2 -1
- package/src/scripts/audit_command_surface.ts +1 -1
- package/src/scripts/audit_mcp_tools.ts +2 -2
- package/src/scripts/audit_skill_overlap_allowlist.json +6 -1
- package/src/scripts/audit_user_type_axis.ts +2 -1
- package/src/scripts/bench_ab_clone.ts +215 -10
- package/src/scripts/bench_ab_integrity.ts +119 -5
- package/src/scripts/bench_ab_v2_stats.ts +40 -213
- package/src/scripts/build_archive_index.ts +1 -1
- package/src/scripts/build_linear_digest.ts +1 -1
- package/src/scripts/build_proof.ts +11 -4
- package/src/scripts/build_rule_trigger_matrix.ts +1 -1
- package/src/scripts/build_source_digests.ts +157 -0
- package/src/scripts/cache_realization_report.ts +103 -0
- package/src/scripts/check_adr_frontmatter.ts +126 -0
- package/src/scripts/check_benchmark_report_fields.ts +207 -0
- package/src/scripts/check_beta_review_markers.ts +235 -6
- package/src/scripts/check_bundle_path_leakage.ts +34 -1
- package/src/scripts/check_claims.ts +576 -6
- package/src/scripts/check_composite_arming.ts +35 -0
- package/src/scripts/check_concern_admissions.ts +365 -0
- package/src/scripts/check_enforcement_coverage.ts +28 -0
- package/src/scripts/check_estate_count.ts +142 -1
- package/src/scripts/check_gate_reachability.ts +383 -0
- package/src/scripts/check_host_loadability.ts +104 -0
- package/src/scripts/check_loss_class_declared.ts +308 -0
- package/src/scripts/check_md_language.ts +15 -98
- package/src/scripts/check_memory_proposal.ts +18 -11
- package/src/scripts/check_no_currency_in_cost_surfaces.ts +225 -0
- package/src/scripts/check_no_external_sources.ts +281 -6
- package/src/scripts/check_pack_conformance_fixture.ts +11 -1
- package/src/scripts/check_pack_size.ts +59 -2
- package/src/scripts/check_preamble_payload_budget.ts +114 -3
- package/src/scripts/check_prefix_stable_mutation.ts +372 -0
- package/src/scripts/check_publish_surface.ts +10 -1
- package/src/scripts/check_references.ts +24 -1
- package/src/scripts/check_rule_evidence_declaration.ts +316 -0
- package/src/scripts/check_rule_projection_integrity.ts +14 -4
- package/src/scripts/check_score_contract.ts +26 -3
- package/src/scripts/check_static_parity.ts +285 -0
- package/src/scripts/check_supervision_claim_atomicity.ts +498 -0
- package/src/scripts/check_suppression_hygiene.ts +15 -0
- package/src/scripts/ci_settle.ts +39 -2
- package/src/scripts/code_graph/build.ts +60 -3
- package/src/scripts/code_graph/extract.ts +44 -0
- package/src/scripts/code_graph/types.ts +24 -0
- package/src/scripts/collector_daemon.ts +714 -0
- package/src/scripts/config_cost_report.ts +302 -0
- package/src/scripts/consumer_matrix.ts +74 -1
- package/src/scripts/cost/budget.mjs +10 -3
- package/src/scripts/cost/track.mjs +10 -3
- package/src/scripts/council_cli.ts +37 -54
- package/src/scripts/dispatch_r2_reviewer.ts +46 -5
- package/src/scripts/evolution_lab.ts +980 -0
- package/src/scripts/external_sources_denylist.json +5 -18
- package/src/scripts/extract_audit_patterns.ts +21 -0
- package/src/scripts/fold_intake.ts +12 -1
- package/src/scripts/gen_discovery_baseline.ts +1 -1
- package/src/scripts/generate_capabilities_index.ts +12 -5
- package/src/scripts/generate_capability_matrix.ts +3 -3
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +2 -2
- package/src/scripts/generate_index.ts +8 -1
- package/src/scripts/generate_knowledge_index.ts +2 -1
- package/src/scripts/generate_ownership_matrix.ts +2 -1
- package/src/scripts/generate_pack_manifests.ts +10 -2
- package/src/scripts/generate_role_experiences_catalog.ts +2 -2
- package/src/scripts/generate_settings_reference.ts +1 -1
- package/src/scripts/git_authorization_hook.ts +22 -1
- package/src/scripts/grade_target_readiness.ts +48 -5
- package/src/scripts/hook_effect_doctor.ts +261 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +98 -11
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +271 -0
- package/src/scripts/hooks/block_unauthorized_git.ts +18 -0
- package/src/scripts/hooks/concern_registry.ts +4 -0
- package/src/scripts/hooks/dispatch_hook.ts +32 -0
- package/src/scripts/hooks/journal_record_hook.ts +345 -0
- package/src/scripts/hooks/prepush_metadata_sources.sh +110 -0
- package/src/scripts/hooks/run_continuation_hook.ts +44 -9
- package/src/scripts/hooks/shims/install.sh +61 -0
- package/src/scripts/hooks/shims/php +101 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +10 -0
- package/src/scripts/hot_context_hook.ts +16 -0
- package/src/scripts/install-hooks.sh +20 -5
- package/src/scripts/install.ts +17 -35
- package/src/scripts/inventory_frontmatter.ts +2 -1
- package/src/scripts/lint_adr_sweep_routing.ts +12 -0
- package/src/scripts/lint_canonical_terms.ts +604 -0
- package/src/scripts/lint_composition_review.ts +619 -0
- package/src/scripts/lint_consolidation_lineage.ts +666 -0
- package/src/scripts/lint_eval_specs.ts +593 -0
- package/src/scripts/lint_hook_manifest.ts +19 -0
- package/src/scripts/lint_host_portability.ts +373 -0
- package/src/scripts/lint_judge_prompt_expectation.ts +27 -1
- package/src/scripts/lint_memory_twin_parity.ts +335 -0
- package/src/scripts/lint_metric_consumers.ts +355 -0
- package/src/scripts/lint_skill_descriptions.ts +18 -1
- package/src/scripts/lint_skill_frontmatter_safety.ts +58 -0
- package/src/scripts/lint_skill_link_reach.ts +252 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +426 -23
- package/src/scripts/lint_ticket_buildable.ts +17 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +1 -1
- package/src/scripts/mcp_server/tool_catalog_source.ts +1 -1
- package/src/scripts/measure_docs_dead_links.ts +348 -0
- package/src/scripts/measure_host_capture.ts +461 -0
- package/src/scripts/migration_status.ts +3 -3
- package/src/scripts/model_rule_injection.ts +60 -0
- package/src/scripts/orchestration_record.ts +14 -0
- package/src/scripts/preamble_byte_census.ts +139 -10
- package/src/scripts/prepack-check.mjs +4 -1
- package/src/scripts/probe_turnaround.ts +384 -0
- package/src/scripts/probe_unblocked_ask.ts +279 -0
- package/src/scripts/render_benchmark_md.ts +1 -1
- package/src/scripts/rule_activation_census.ts +70 -9
- package/src/scripts/rule_backlinks.ts +1 -1
- package/src/scripts/run_lifecycle_suite.ts +208 -0
- package/src/scripts/run_skill_evals.ts +40 -0
- package/src/scripts/schemas/delivery-manifest.schema.json +43 -0
- package/src/scripts/schemas/drafting-channels.schema.json +43 -0
- package/src/scripts/schemas/evals.schema.json +24 -1
- package/src/scripts/schemas/rule.schema.json +52 -1
- package/src/scripts/schemas/skill.schema.json +17 -2
- package/src/scripts/skill_overlap.ts +7 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +8 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +84 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +8 -1
- package/src/scripts/skill_usage_report.ts +2 -1
- package/src/scripts/stubs_due.ts +211 -0
- package/src/scripts/sweep_source_surfaces.ts +678 -0
- package/src/scripts/sync_pr_branch.ts +3 -3
- package/src/scripts/trigger_eval_grandfather.json +202 -222
- package/src/scripts/utilization_report.ts +22 -2
- package/src/server/schemas/settings.ts +5 -0
- package/src/templates/marketing-copy.yml +1 -1
- package/dist/ui/assets/index-Cxgy63kz.js +0 -26
|
@@ -25,6 +25,10 @@ enforced_by:
|
|
|
25
25
|
- "instruction-only: close-the-source-and-re-derive is a pre-write reasoning step only the model observes; CI checks the ledger, never the derivation"
|
|
26
26
|
# obligation: line 40
|
|
27
27
|
obligation_frequency: "per-edit"
|
|
28
|
+
evidence:
|
|
29
|
+
source_type: external-research
|
|
30
|
+
verified_on: 2026-08-30
|
|
31
|
+
normative_level: informative
|
|
28
32
|
---
|
|
29
33
|
|
|
30
34
|
# Code Provenance
|
|
@@ -98,7 +98,7 @@ MANDATE, NEVER A **PIXEL** MANDATE — WHATEVER `design.fidelity_mode` SAYS.
|
|
|
98
98
|
REPRODUCING A WIREFRAME'S GREYS 1:1 HONOURS THE WRONG HALF OF THE ARTEFACT.
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
-
`strict` means *do not redesign*; never *reproduce a wireframe's placeholder
|
|
101
|
+
`strict` means *do not redesign*; never *reproduce a wireframe's placeholder grays*, which
|
|
102
102
|
are **non-decisions** ([`wireframe`](../skills/wireframe/SKILL.md) § Gotchas).
|
|
103
103
|
**The discriminator reads the ARTEFACT, never the prose.** A finished comp whose prose
|
|
104
104
|
mentions a wireframe it replaces routes **strictly** — a reference to a previous artefact,
|
|
@@ -44,6 +44,10 @@ workspaces: [agent-config-maintainer, construction, engineering, finance, founde
|
|
|
44
44
|
packs: [meta]
|
|
45
45
|
# obligation: line 52
|
|
46
46
|
obligation_frequency: "per-task"
|
|
47
|
+
evidence:
|
|
48
|
+
source_type: external-standard
|
|
49
|
+
verified_on: 2026-08-30
|
|
50
|
+
normative_level: mandatory
|
|
47
51
|
---
|
|
48
52
|
|
|
49
53
|
# Domain Safety — PII Redaction
|
|
@@ -29,6 +29,10 @@ workspaces: [agent-config-maintainer, construction, engineering, finance, founde
|
|
|
29
29
|
packs: [meta]
|
|
30
30
|
# obligation: line 47
|
|
31
31
|
obligation_frequency: "per-turn"
|
|
32
|
+
evidence:
|
|
33
|
+
source_type: external-standard
|
|
34
|
+
verified_on: 2026-08-30
|
|
35
|
+
normative_level: mandatory
|
|
32
36
|
---
|
|
33
37
|
|
|
34
38
|
# Domain Safety — Data Retention
|
|
@@ -24,13 +24,12 @@ obligation_frequency: "per-turn"
|
|
|
24
24
|
# External Code-Graph Interop
|
|
25
25
|
|
|
26
26
|
Some repos commit a pre-built code-intelligence index — a `graph.json`-shaped
|
|
27
|
-
artifact or a SCIP index (`index.scip`, `*.scip`).
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
where it wins** (ADR-124): query a consumer-shipped index when it
|
|
31
|
-
and fresh; where none is shipped
|
|
32
|
-
|
|
33
|
-
way — query first, grep as fallback, and name which source answered.
|
|
27
|
+
artifact or a SCIP index (`index.scip`, `*.scip`). One that exists is already
|
|
28
|
+
built and structured, so it is the cheap first question for "who calls X",
|
|
29
|
+
"where is Y used", "what does this import". This suite is an **orchestrator
|
|
30
|
+
first, owner where it wins** (ADR-124): query a consumer-shipped index when it
|
|
31
|
+
is present and fresh; where none is shipped, the native engine (default-off,
|
|
32
|
+
benchmark-gated) covers the gap.
|
|
34
33
|
|
|
35
34
|
## The rule
|
|
36
35
|
|
|
@@ -59,6 +58,11 @@ AND the repo contains a detectable index:
|
|
|
59
58
|
3. **Fall back to `grep`/read** only for what the index does not cover, and say
|
|
60
59
|
so ("the index has no entry for X, so I grepped").
|
|
61
60
|
|
|
61
|
+
Query-first is an **ordering** heuristic, never a claim the index answers better:
|
|
62
|
+
measured 2026-08-28, zero of four graph-shaped classes beat `grep`, so no class
|
|
63
|
+
is graph-first. Routing changes; permission does not. Figures:
|
|
64
|
+
[`code-intelligence`](../skills/code-intelligence/SKILL.md) § Measured.
|
|
65
|
+
|
|
62
66
|
## When NOT to fire
|
|
63
67
|
|
|
64
68
|
- No such index in the repo — normal `grep`/read is the right first move.
|
|
@@ -67,11 +71,9 @@ AND the repo contains a detectable index:
|
|
|
67
71
|
## See also
|
|
68
72
|
|
|
69
73
|
- [`code-intelligence`](../skills/code-intelligence/SKILL.md) — the executable
|
|
70
|
-
routing skill
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
session; on instruction-file hosts this rule is the surface. Which of the two
|
|
74
|
-
you are on is `agent-config hooks:status`, not a guess from the host name.
|
|
74
|
+
routing skill (`agent-config code-graph detect|query|affected|path`), the
|
|
75
|
+
measured per-class figures, and the hook-vs-instruction-file surface question
|
|
76
|
+
(`agent-config hooks:status`, never a guess from the host name).
|
|
75
77
|
- [`discovery_graph`](../scripts/discovery_graph.ts) — this suite's OWN artefact
|
|
76
78
|
relation-graph (`affected`/`explain`); the external code-graph is the
|
|
77
79
|
*source-code* analogue this rule defers to for code questions.
|
|
@@ -64,16 +64,14 @@ Trigger-set above activates this routing on demand, independent of the disciplin
|
|
|
64
64
|
**Challenge to improve, never to refuse.**
|
|
65
65
|
|
|
66
66
|
The agent is a thought partner, not a gatekeeper. After presenting concerns:
|
|
67
|
-
- User picks an option → execute immediately
|
|
68
|
-
- User says "just do it" → execute immediately
|
|
67
|
+
- User picks an option, or says "just do it" → execute immediately
|
|
69
68
|
- Never argue twice about the same point
|
|
70
69
|
- Never block work — delay is only justified if it prevents a clear mistake
|
|
71
70
|
|
|
72
71
|
## Creating new agent artifacts
|
|
73
72
|
|
|
74
|
-
When the request is to create or significantly rewrite a skill, rule, command,
|
|
75
|
-
|
|
76
|
-
[`artifact-drafting-protocol`](artifact-drafting-protocol.md)'s Phase B
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
before creating a new file.
|
|
73
|
+
When the request is to create or significantly rewrite a skill, rule, command, or
|
|
74
|
+
guideline, the "fit the existing architecture" check is handled by
|
|
75
|
+
[`artifact-drafting-protocol`](artifact-drafting-protocol.md)'s Phase B (Research).
|
|
76
|
+
Follow that protocol instead of improvising a one-shot check — it scans `src/` for
|
|
77
|
+
overlap and reports candidates to extend before creating a new file.
|
|
@@ -26,7 +26,7 @@ obligation_frequency: "none"
|
|
|
26
26
|
|
|
27
27
|
# Laravel Routing
|
|
28
28
|
|
|
29
|
-
**Iron Law.** Laravel-flavoured PHP
|
|
29
|
+
**Iron Law.** Laravel-flavoured PHP → `laravel`. Discriminator: entry point and router, not the dependency list — `illuminate/*` with no skeleton marker is the third verdict.
|
|
30
30
|
|
|
31
31
|
Body migrated to `skill:laravel`. Disambiguates the laravel ↔ symfony-workflow cluster head per [`adr-architectural-consensus-mechanism`](../docs/contracts/adr-architectural-consensus-mechanism.md).
|
|
32
32
|
Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
|
|
@@ -22,6 +22,10 @@ collision_ok:
|
|
|
22
22
|
"src/agent-src/commands/": "command authoring reviews the three trifecta legs"
|
|
23
23
|
# obligation: line 60
|
|
24
24
|
obligation_frequency: "per-edit"
|
|
25
|
+
evidence:
|
|
26
|
+
source_type: external-standard
|
|
27
|
+
verified_on: 2026-08-30
|
|
28
|
+
normative_level: recommended
|
|
25
29
|
---
|
|
26
30
|
|
|
27
31
|
# Lethal-Trifecta Guard
|
|
@@ -91,43 +91,21 @@ substitute for not writing the attribution in the first place.
|
|
|
91
91
|
|
|
92
92
|
## Why this rule is not path-scoped
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
rules
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
migrated POINTER stubs held at their pointer's size by
|
|
106
|
-
`check_rule_stub_ceiling` — prose added there is prose in the wrong place by that
|
|
107
|
-
gate's own contract, which is what caught the first attempt to duplicate it.
|
|
108
|
-
|
|
109
|
-
AI council 2026-08-20, 2/2 convergent on this option over three alternatives, with
|
|
110
|
-
two independent decisive arguments. First: the obligation governs an **authoring
|
|
111
|
-
decision**, which happens before any file exists for a path trigger to match — so
|
|
112
|
-
path-scoping fails at greenfield creation whether or not a compaction ever occurs.
|
|
113
|
-
Second: the measured cost is small against what the partition returns. Keeping an
|
|
114
|
-
unscoped global copy was rejected because it re-creates the duplication the
|
|
115
|
-
partition exists to remove; splitting the four by "has a CI gate" was rejected by
|
|
116
|
-
both seats as the wrong axis — a validator observes an outcome, it does not hold an
|
|
117
|
-
obligation during the session, and `rule-type-governance` has no gate at all.
|
|
118
|
-
|
|
119
|
-
**Cost, measured and corrected.** An earlier revision of this note claimed 1,754
|
|
120
|
-
tokens (1.8 % of the partition's 96,584-token saving). That figure was a
|
|
121
|
-
`chars / 4` proxy over the projected files and **understated the real cost by about
|
|
122
|
-
half**: `check_rule_activation_census`, which counts with the exact BPE tokenizer,
|
|
123
|
-
measures the unconditional corpus growing **108,130 → 111,642, i.e. +3,512 tokens
|
|
124
|
-
(3.6 %)** — and that number includes this rationale, which is why it lives in one
|
|
125
|
-
place instead of four. The verdict does not depend on the figure: one seat argued
|
|
126
|
-
the token axis was the wrong one entirely, the other that cost is a legitimate axis
|
|
127
|
-
which simply loses this particular comparison. Both readings survive 3.6 %.
|
|
94
|
+
Delivered unconditionally by the PROJECT layer, with no `paths:` triggers: the
|
|
95
|
+
obligation governs an **authoring decision** taken before any file exists for a
|
|
96
|
+
path trigger to match, and a path-scoped rule is not re-injected after
|
|
97
|
+
`/compact`, so scoping it would make the obligation vanish mid-session. The
|
|
98
|
+
measurement, the AI-council record of 2026-08-20, the three rejected
|
|
99
|
+
alternatives and the +3,512-token cost this shared note carries for four rules
|
|
100
|
+
live in
|
|
101
|
+
[`source-confidentiality-mechanics`](../docs/guidelines/agent-infra/source-confidentiality-mechanics.md)
|
|
102
|
+
§ Why these four rules are unconditional — moved there 2026-08-29 because a
|
|
103
|
+
rationale paid on every subagent spawn is the most expensive place to keep an
|
|
104
|
+
argument nobody re-reads.
|
|
128
105
|
|
|
129
106
|
## See also
|
|
130
107
|
|
|
108
|
+
- [`source-confidentiality-mechanics`](../docs/guidelines/agent-infra/source-confidentiality-mechanics.md) — the claim/residual honesty clause, the two-class split by path, and the gate's shape checks and tiering.
|
|
131
109
|
- [`source-of-truth`](source-of-truth.md) — edit `src/`, never the projections.
|
|
132
110
|
- [`augment-edit-discipline`](augment-edit-discipline.md) — portability + cross-ref sync.
|
|
133
111
|
- `src/scripts/_lib/link_crypto.ts` — encrypted link storage.
|
|
@@ -22,7 +22,7 @@ obligation_frequency: "none"
|
|
|
22
22
|
|
|
23
23
|
# Symfony Routing
|
|
24
24
|
|
|
25
|
-
**Iron Law.** Symfony-flavoured PHP
|
|
25
|
+
**Iron Law.** Symfony-flavoured PHP → `symfony-workflow`. Discriminator: entry point and router, not the dependency list — `symfony/*` with no skeleton marker is the third verdict.
|
|
26
26
|
|
|
27
27
|
Body migrated to `skill:symfony-workflow`. Disambiguates the laravel ↔ symfony-workflow cluster head per [`adr-architectural-consensus-mechanism`](../docs/contracts/adr-architectural-consensus-mechanism.md).
|
|
28
28
|
Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
|
|
@@ -28,6 +28,20 @@ NEVER CALL THE SAME TOOL >2 TIMES IN A ROW WITH SIMILAR PARAMETERS.
|
|
|
28
28
|
IF YOU CATCH YOURSELF REPEATING → STOP, RETHINK, ASK.
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
+
## Independent calls go in ONE block
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
CALLS WITH NO DEPENDENCY BETWEEN THEM GO IN THE SAME BLOCK.
|
|
35
|
+
A CALL THAT DOES NOT READ THE PREVIOUS RESULT IS NOT A SECOND TURN.
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The ceiling above forbids repetition; this forbids splitting work that had no
|
|
39
|
+
reason to be split — measured mean batch size **1.01**, i.e. fully serial. The
|
|
40
|
+
discriminator is the dependency, never the count. NOT "write shorter commands":
|
|
41
|
+
the long commands are already the batching. `instruction-only` — nothing can
|
|
42
|
+
observe a call that was not batched. Evidence + the absent-cause finding:
|
|
43
|
+
[`token-efficiency-mechanics`](../contexts/communication/rules-auto/token-efficiency-mechanics.md).
|
|
44
|
+
|
|
31
45
|
## Enumerated file sets are ONE operation, not N repetitions
|
|
32
46
|
|
|
33
47
|
The same-tool ceiling counts *repetition without new information* — the loop where the agent re-runs a tool because it did not learn from the last result. Reading N **declared, enumerated** files is the opposite: each read returns different content and the set was known before the first call. Counting it as N repetitions puts this rule in direct conflict with [`downstream-changes`](downstream-changes.md) ("find **ALL** callers, tests, imports") and with [`source-discovery-gate`](source-discovery-gate.md), which cannot be satisfied in two calls.
|
|
@@ -12,6 +12,10 @@ enforced_by:
|
|
|
12
12
|
- "validator:src/scripts/lint_agent_security.ts"
|
|
13
13
|
# obligation: line 19
|
|
14
14
|
obligation_frequency: "per-edit"
|
|
15
|
+
evidence:
|
|
16
|
+
source_type: external-standard
|
|
17
|
+
verified_on: 2026-08-30
|
|
18
|
+
normative_level: recommended
|
|
15
19
|
---
|
|
16
20
|
|
|
17
21
|
# Tool Safety
|
|
@@ -21,6 +21,10 @@ enforced_by:
|
|
|
21
21
|
- "instruction-only: no deterministic gate inspects fetched content for injected instructions; injection_scan_hook is warn-only and default-OFF"
|
|
22
22
|
# obligation: line 38
|
|
23
23
|
obligation_frequency: "per-event"
|
|
24
|
+
evidence:
|
|
25
|
+
source_type: external-standard
|
|
26
|
+
verified_on: 2026-08-30
|
|
27
|
+
normative_level: recommended
|
|
24
28
|
---
|
|
25
29
|
|
|
26
30
|
<!-- security-lint: allow instruction-smuggling "defense rule: quotes role-takeover phrases (ignore previous instructions, you are now, <IMPORTANT>) to teach refusal" -->
|
|
@@ -59,6 +59,7 @@ import process from 'node:process';
|
|
|
59
59
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
60
60
|
|
|
61
61
|
import { collect } from './update_roadmap_progress.js';
|
|
62
|
+
import { guardedBaselineProblems, parseGuardedBaselines } from './guarded_baseline.js';
|
|
62
63
|
|
|
63
64
|
const _HERE = fileURLToPath(import.meta.url);
|
|
64
65
|
|
|
@@ -144,7 +145,7 @@ function _branch_touched_paths(root: string, base: string): Set<string> | null {
|
|
|
144
145
|
* the payload. Rewriting them detaches the patch from the commit it records
|
|
145
146
|
* AND makes `git apply` target a path the diff never created.
|
|
146
147
|
*
|
|
147
|
-
* Measured 2026-08-11: archiving one roadmap rewrote four frozen
|
|
148
|
+
* Measured 2026-08-11: archiving one roadmap rewrote four frozen artifacts
|
|
148
149
|
* under `agents/evidence/reviews/`, including the `diff.patch` headers of a
|
|
149
150
|
* recorded review input. Nothing caught it — the sweep reported it as
|
|
150
151
|
* "4 ref(s) migrated", which reads like success.
|
|
@@ -311,7 +312,202 @@ interface ArchiveRecord {
|
|
|
311
312
|
refs_migrated: string[];
|
|
312
313
|
}
|
|
313
314
|
|
|
314
|
-
|
|
315
|
+
|
|
316
|
+
/** One `[~]` step and whatever resolution annotation follows it. */
|
|
317
|
+
export interface DeferredItem {
|
|
318
|
+
/** The step text, trimmed, for the operator message. */
|
|
319
|
+
text: string;
|
|
320
|
+
/** `carried-to` / `merged-into`, or `null` when no annotation was found. */
|
|
321
|
+
kind: 'carried-to' | 'merged-into' | null;
|
|
322
|
+
/** Destination roadmap slug, or `null`. */
|
|
323
|
+
destination: string | null;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* `<!-- deferred-resolution: carried-to=<slug> -->` — the resolved-deferral
|
|
328
|
+
* annotation. `merged-into=<slug>` is the second accepted form.
|
|
329
|
+
*/
|
|
330
|
+
const DEFERRED_RESOLUTION_RE = /<!--\s*deferred-resolution:\s*(carried-to|merged-into)\s*=\s*([A-Za-z0-9._-]+)\s*-->/;
|
|
331
|
+
|
|
332
|
+
/** `- [~] …` — a deferred step, at any indent, with `-` or `*`. */
|
|
333
|
+
const DEFERRED_STEP_RE = /^[ \t]*[-*][ \t]+\[~\][ \t]*(.*)$/;
|
|
334
|
+
/** Any other checkbox, or a heading — where a step's block ends. */
|
|
335
|
+
const BLOCK_END_RE = /^[ \t]*[-*][ \t]+\[[ xX~-]\]|^#{1,6}[ \t]/;
|
|
336
|
+
|
|
337
|
+
/** Escape a string for literal use inside a `RegExp`. */
|
|
338
|
+
function _escapeRe(v: string): string {
|
|
339
|
+
return v.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Does this frontmatter declare a `relates:` row naming `slug`?
|
|
344
|
+
*
|
|
345
|
+
* Structured, not textual: the slug has to appear as a `- slug: <name>` row or a
|
|
346
|
+
* bare `- <name>` item inside the `relates:` block, which is a declaration the
|
|
347
|
+
* author made deliberately. A mention anywhere else in the file does not count.
|
|
348
|
+
*/
|
|
349
|
+
function _relatesTo(text: string, slug: string): boolean {
|
|
350
|
+
const lines = text.split('\n');
|
|
351
|
+
const start = lines.findIndex((l) => /^relates:/.test(l));
|
|
352
|
+
if (start === -1) return false;
|
|
353
|
+
const re = new RegExp(`^\\s*-\\s*(slug:\\s*)?${_escapeRe(slug)}\\s*$`);
|
|
354
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
355
|
+
const line = lines[i] as string;
|
|
356
|
+
if (/^\S/.test(line)) break;
|
|
357
|
+
if (re.test(line)) return true;
|
|
358
|
+
}
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/** Every `[~]` step in a roadmap, with the annotation that follows it (if any). */
|
|
363
|
+
export function parseDeferredItems(text: string): DeferredItem[] {
|
|
364
|
+
const lines = text.split('\n');
|
|
365
|
+
const out: DeferredItem[] = [];
|
|
366
|
+
for (let i = 0; i < lines.length; i++) {
|
|
367
|
+
const m = DEFERRED_STEP_RE.exec(lines[i] as string);
|
|
368
|
+
if (m === null) continue;
|
|
369
|
+
// The annotation may sit on the step line itself or anywhere in the
|
|
370
|
+
// step's continuation block, which ends at the next checkbox or heading.
|
|
371
|
+
let block = lines[i] as string;
|
|
372
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
373
|
+
if (BLOCK_END_RE.test(lines[j] as string)) break;
|
|
374
|
+
block += '\n' + (lines[j] as string);
|
|
375
|
+
}
|
|
376
|
+
const a = DEFERRED_RESOLUTION_RE.exec(block);
|
|
377
|
+
out.push({
|
|
378
|
+
text: (m[1] ?? '').trim().slice(0, 120),
|
|
379
|
+
kind: a === null ? null : (a[1] as 'carried-to' | 'merged-into'),
|
|
380
|
+
destination: a === null ? null : (a[2] as string),
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
return out;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Decide whether a roadmap's `[~]` items are RESOLVED, per the AI council of
|
|
388
|
+
* 2026-08-27 (2 seats, convergent on option (c)).
|
|
389
|
+
*
|
|
390
|
+
* Iron Law 3 says a deferral must be resolved before archival, and the
|
|
391
|
+
* preservation test routes four dispositions to the council — but three of them
|
|
392
|
+
* (carry to a follow-up, merge into existing work, restore to open) leave the
|
|
393
|
+
* `[~]` glyph in place, and this sweep used to require `deferred === 0`
|
|
394
|
+
* unconditionally. So a genuinely UNEXECUTABLE item — one needing elapsed time
|
|
395
|
+
* rather than effort — had no council-reachable path to an archived roadmap, and
|
|
396
|
+
* the only glyph that cleared the gate was `[-]`, which is owner-reserved AND
|
|
397
|
+
* pinned to mean "won't happen at all". Using it for a carried item would make
|
|
398
|
+
* cancellation and transfer indistinguishable to every later reader.
|
|
399
|
+
*
|
|
400
|
+
* **Fail-closed at every step**, which is the condition both seats attached to
|
|
401
|
+
* their verdict: a bare `[~]` blocks, a malformed annotation blocks, a
|
|
402
|
+
* destination that does not exist blocks, a destination that is itself archived
|
|
403
|
+
* or skipped blocks, and a missing back-link blocks. The annotation is cheap to
|
|
404
|
+
* write and must therefore be expensive to satisfy.
|
|
405
|
+
*
|
|
406
|
+
* NOT checked, and named rather than implied: that the destination's copy of the
|
|
407
|
+
* criterion is faithful. Both seats asked for stable item identity over verbatim
|
|
408
|
+
* text matching, and neither a text match nor an id exists today — the back-link
|
|
409
|
+
* plus the source-slug mention is the strongest link this sweep can verify
|
|
410
|
+
* without inventing an identity scheme. The reviewer of the carry still reads it.
|
|
411
|
+
*
|
|
412
|
+
* @returns `problems` empty ⇒ every deferral is resolved and archival may proceed.
|
|
413
|
+
*/
|
|
414
|
+
export function deferralProblems(
|
|
415
|
+
root: string,
|
|
416
|
+
rel: string,
|
|
417
|
+
text: string,
|
|
418
|
+
/**
|
|
419
|
+
* Slugs this same sweep is about to archive. A destination in this set is
|
|
420
|
+
* about to become dead, so accepting it would leave the carried item with no
|
|
421
|
+
* live receiver — the exact loss the annotation exists to prevent, produced
|
|
422
|
+
* by the mechanism meant to prevent it. Found by an independent review, with
|
|
423
|
+
* two reproducers: a roadmap naming ITSELF as destination, and two roadmaps
|
|
424
|
+
* both complete in one run where the parent carries to the child.
|
|
425
|
+
*
|
|
426
|
+
* Optional so the unit tests can call this with one roadmap in view; the
|
|
427
|
+
* sweep always passes the real set.
|
|
428
|
+
*/
|
|
429
|
+
alsoArchiving: ReadonlySet<string> = new Set(),
|
|
430
|
+
): string[] {
|
|
431
|
+
const sourceSlug = rel.replace(/\.md$/, '');
|
|
432
|
+
const problems: string[] = [];
|
|
433
|
+
for (const item of parseDeferredItems(text)) {
|
|
434
|
+
const label = item.text === '' ? '(unnamed step)' : item.text;
|
|
435
|
+
if (item.kind === null || item.destination === null) {
|
|
436
|
+
problems.push(
|
|
437
|
+
`deferred step ${JSON.stringify(label)} carries no ` +
|
|
438
|
+
'`<!-- deferred-resolution: carried-to=<slug> -->` annotation',
|
|
439
|
+
);
|
|
440
|
+
continue;
|
|
441
|
+
}
|
|
442
|
+
// Active or parked are both live. Archived and skipped are not: carrying
|
|
443
|
+
// an item into a dead roadmap is the silent loss the annotation exists
|
|
444
|
+
// to prevent, and it is exactly the "broken promise" case one seat asked
|
|
445
|
+
// to be detectable.
|
|
446
|
+
const candidates = [
|
|
447
|
+
path.join(root, 'agents', 'roadmaps', `${item.destination}.md`),
|
|
448
|
+
path.join(root, 'agents', 'roadmaps', 'later', `${item.destination}.md`),
|
|
449
|
+
];
|
|
450
|
+
// Self-reference is never a carry. It passes every other check — the
|
|
451
|
+
// file exists, and a `parent_roadmap:` naming itself would satisfy the
|
|
452
|
+
// back-link — and then the sweep archives it, so the destination is dead
|
|
453
|
+
// the moment the source is.
|
|
454
|
+
if (item.destination === sourceSlug) {
|
|
455
|
+
problems.push(
|
|
456
|
+
`deferred step ${JSON.stringify(label)} names its OWN roadmap as the destination — ` +
|
|
457
|
+
'a carry needs a different receiver, or the item is not carried at all',
|
|
458
|
+
);
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
if (alsoArchiving.has(item.destination)) {
|
|
462
|
+
problems.push(
|
|
463
|
+
`destination \`${item.destination}\` is being archived by this same sweep, so it would be ` +
|
|
464
|
+
'dead the moment the carry lands — archive it first and re-run, or carry to a roadmap that stays active',
|
|
465
|
+
);
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
const found = candidates.find((c) => fs.existsSync(c));
|
|
469
|
+
if (found === undefined) {
|
|
470
|
+
const dead = ['archive', 'skipped'].find((d) =>
|
|
471
|
+
fs.existsSync(path.join(root, 'agents', 'roadmaps', d, `${item.destination ?? ''}.md`)),
|
|
472
|
+
);
|
|
473
|
+
problems.push(
|
|
474
|
+
dead === undefined
|
|
475
|
+
? `deferred step ${JSON.stringify(label)} names destination \`${item.destination}\`, which does not exist`
|
|
476
|
+
: `deferred step ${JSON.stringify(label)} names destination \`${item.destination}\`, which is in \`${dead}/\` — a dead roadmap cannot receive a carried item`,
|
|
477
|
+
);
|
|
478
|
+
continue;
|
|
479
|
+
}
|
|
480
|
+
const destText = fs.readFileSync(found, 'utf-8');
|
|
481
|
+
// ESCAPED. The slug was interpolated raw, so `road.parent` matched
|
|
482
|
+
// `roadXparent` and a slug containing `[` or `(` made `new RegExp` THROW
|
|
483
|
+
// and abort the whole sweep — in a function whose entire contract is
|
|
484
|
+
// failing closed. Found by an independent review; both seats named it.
|
|
485
|
+
const backlink = new RegExp(`^parent_roadmap:[ \t]*${_escapeRe(sourceSlug)}[ \t]*$`, 'm');
|
|
486
|
+
if (item.kind === 'carried-to' && !backlink.test(destText)) {
|
|
487
|
+
problems.push(
|
|
488
|
+
`destination \`${item.destination}\` carries no \`parent_roadmap: ${sourceSlug}\` back-link — ` +
|
|
489
|
+
'the link must be verifiable from both ends',
|
|
490
|
+
);
|
|
491
|
+
continue;
|
|
492
|
+
}
|
|
493
|
+
// A STRUCTURED link, not a substring. `destText.includes(sourceSlug)` was
|
|
494
|
+
// satisfied by any incidental mention — a filename, an example, an HTML
|
|
495
|
+
// comment — so `merged-into` proved nothing about a merge. Both review
|
|
496
|
+
// seats called it trivially spoofable. The link now has to be a
|
|
497
|
+
// frontmatter declaration: a `relates:` row naming the source, or a
|
|
498
|
+
// `parent_roadmap:` back-link. Prose cannot satisfy it.
|
|
499
|
+
if (item.kind === 'merged-into' && !backlink.test(destText) && !_relatesTo(destText, sourceSlug)) {
|
|
500
|
+
problems.push(
|
|
501
|
+
`destination \`${item.destination}\` carries no structured link back to \`${sourceSlug}\` — ` +
|
|
502
|
+
'add a `relates:` row naming it (with a `relation:`) or a `parent_roadmap:` line. A mention ' +
|
|
503
|
+
'in prose is not a link: it is satisfied by a filename or an example.',
|
|
504
|
+
);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return problems;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
/** Archive every complete active roadmap: no open steps, and every `[~]` resolved. */
|
|
315
511
|
function archive_completed(
|
|
316
512
|
root: string,
|
|
317
513
|
opts: { changed_only: boolean; base: string; dry_run: boolean },
|
|
@@ -331,11 +527,59 @@ function archive_completed(
|
|
|
331
527
|
return [];
|
|
332
528
|
}
|
|
333
529
|
|
|
530
|
+
// Every slug this sweep will consider archiving, computed BEFORE any of them
|
|
531
|
+
// is judged. Without it, a deferral carried to another roadmap that is also
|
|
532
|
+
// complete passes validation and then loses its receiver in the same run.
|
|
533
|
+
const sweepSet = new Set(
|
|
534
|
+
collect(roadmap_root)
|
|
535
|
+
.filter((s2) => s2.open_ === 0)
|
|
536
|
+
.map((s2) => s2.rel.replace(/\.md$/, '')),
|
|
537
|
+
);
|
|
538
|
+
|
|
334
539
|
const archived: ArchiveRecord[] = [];
|
|
335
540
|
for (const stats of collect(roadmap_root)) {
|
|
336
|
-
|
|
541
|
+
// `guarded-baseline` is INCOMPLETE by construction (council 2026-08-31,
|
|
542
|
+
// 2/2 convergent) — checked BEFORE the open-step test on purpose. A
|
|
543
|
+
// well-formed record keeps its box `[ ]` and would be skipped silently as
|
|
544
|
+
// "not complete", which is the right verdict reached for the wrong reason
|
|
545
|
+
// and invisible in a sweep that only reports what it moved; a MALFORMED
|
|
546
|
+
// one on `[x]` would otherwise archive with an annotation claiming the
|
|
547
|
+
// opposite. Both are named here instead.
|
|
548
|
+
const guarded = parseGuardedBaselines(
|
|
549
|
+
fs.readFileSync(path.join(roadmap_root, stats.rel), 'utf-8'),
|
|
550
|
+
);
|
|
551
|
+
if (guarded.length > 0) {
|
|
552
|
+
process.stderr.write(
|
|
553
|
+
` ⚠️ ${stats.rel}: ${guarded.length} guarded-baseline step(s) — ` +
|
|
554
|
+
'not archived. Verify against the real mechanism, then flip to ' +
|
|
555
|
+
'`[x]`.\n',
|
|
556
|
+
);
|
|
557
|
+
for (const p of guardedBaselineProblems(guarded)) {
|
|
558
|
+
process.stderr.write(` · ${p}\n`);
|
|
559
|
+
}
|
|
560
|
+
continue;
|
|
561
|
+
}
|
|
562
|
+
if (stats.open_ !== 0) {
|
|
337
563
|
continue; // not complete
|
|
338
564
|
}
|
|
565
|
+
// A `[~]` no longer blocks unconditionally: it blocks unless it carries a
|
|
566
|
+
// validated resolution annotation. See `deferralProblems` for why, and
|
|
567
|
+
// for every way that check fails closed.
|
|
568
|
+
if (stats.deferred !== 0) {
|
|
569
|
+
const abs = path.join(roadmap_root, stats.rel);
|
|
570
|
+
// The source's own slug is removed: it is trivially in `sweepSet`,
|
|
571
|
+
// and self-reference is reported by its own, clearer message.
|
|
572
|
+
const others = new Set(sweepSet);
|
|
573
|
+
others.delete(stats.rel.replace(/\.md$/, ''));
|
|
574
|
+
const problems = deferralProblems(root, stats.rel, fs.readFileSync(abs, 'utf-8'), others);
|
|
575
|
+
if (problems.length > 0) {
|
|
576
|
+
process.stderr.write(
|
|
577
|
+
` ⚠️ ${stats.rel}: ${problems.length} unresolved deferral(s) — not archived.\n`,
|
|
578
|
+
);
|
|
579
|
+
for (const p of problems) process.stderr.write(` · ${p}\n`);
|
|
580
|
+
continue;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
339
583
|
// An unresolved blocker outlives its steps. Closing every box does not
|
|
340
584
|
// answer a question the roadmap raised for a human, and archiving on
|
|
341
585
|
// step-count alone is how `b-highlights-mechanism` left the active tree
|