@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
|
@@ -7,34 +7,77 @@
|
|
|
7
7
|
|
|
8
8
|
## Indexing
|
|
9
9
|
|
|
10
|
+
Three separate things get conflated here, and keeping them apart is what makes
|
|
11
|
+
the rest of this section decidable:
|
|
12
|
+
|
|
13
|
+
1. **Declaring an integrity constraint** — a uniqueness or foreign-key
|
|
14
|
+
constraint. This is a correctness decision about the data model.
|
|
15
|
+
2. **Indexing the referencing column** — the child side of a foreign key, which
|
|
16
|
+
is what makes the lookup and the constraint check fast.
|
|
17
|
+
3. **Adding an optional query-performance index** — everything else.
|
|
18
|
+
|
|
19
|
+
The row-count guidance below governs **(3) only**. It has never governed (1),
|
|
20
|
+
and it must not be read as governing (2).
|
|
21
|
+
|
|
10
22
|
### When to add indexes
|
|
11
23
|
|
|
12
24
|
- Columns in `WHERE` clauses
|
|
13
25
|
- Columns in `JOIN` conditions
|
|
14
26
|
- Columns in `ORDER BY` (especially with pagination)
|
|
15
27
|
- Foreign key columns (Laravel adds with `foreignId()`)
|
|
28
|
+
- Columns carrying a declared uniqueness constraint
|
|
16
29
|
|
|
17
30
|
### When NOT to add indexes
|
|
18
31
|
|
|
32
|
+
These apply to **optional performance indexes** — category (3) above:
|
|
33
|
+
|
|
19
34
|
- Boolean columns with low selectivity (99% same value)
|
|
20
|
-
-
|
|
35
|
+
- Tables that are both small (< 1000 rows) **and rarely accessed**
|
|
21
36
|
- Frequently updated columns (indexes slow writes)
|
|
22
37
|
|
|
38
|
+
**Row count decides nothing on its own.** A 40-row lookup table joined in every
|
|
39
|
+
report query and a 40-row config table read twice a week are the same size and
|
|
40
|
+
not the same decision — index the first on its observed access pattern, leave
|
|
41
|
+
the second alone. "Small" without "rarely accessed" is the folklore half of this
|
|
42
|
+
rule.
|
|
43
|
+
|
|
44
|
+
**Foreign-key and uniqueness indexes are created regardless of table size.**
|
|
45
|
+
They serve integrity and lookup latency, and a row count bears on neither. A
|
|
46
|
+
40-row child table pointing at a customers table gets its foreign-key column
|
|
47
|
+
indexed like any other. Omit one only on the strength of inspected schema
|
|
48
|
+
behavior plus a representative workload measurement showing it serves no access
|
|
49
|
+
path — never on an anticipated write cost.
|
|
50
|
+
|
|
23
51
|
### Composite indexes
|
|
24
52
|
|
|
25
|
-
Order matters
|
|
53
|
+
Order matters, and what decides it is the **predicate shape**, not selectivity:
|
|
54
|
+
|
|
55
|
+
1. Columns compared with **equality** (`=`, `IN`) come first.
|
|
56
|
+
2. Then the column compared with a **range** (`<`, `>`, `BETWEEN`, `LIKE 'x%'`).
|
|
57
|
+
3. Then columns the query only **orders by**.
|
|
58
|
+
|
|
59
|
+
Selectivity is a tie-break *within* a group, never the primary key of the
|
|
60
|
+
decision. An index cannot use any column after the first range predicate for
|
|
61
|
+
lookup, so a highly selective range column placed first throws away every column
|
|
62
|
+
behind it.
|
|
26
63
|
|
|
27
64
|
```php
|
|
65
|
+
// WHERE customer_id = ? AND created_at > ? ORDER BY created_at
|
|
28
66
|
$table->index(['customer_id', 'created_at']);
|
|
29
67
|
```
|
|
30
68
|
|
|
69
|
+
`customer_id` leads because it is the **equality** predicate — not because it is
|
|
70
|
+
more selective. Reverse the order and the equality column sits behind a range,
|
|
71
|
+
where the index can no longer seek on it. That holds even when `created_at` is
|
|
72
|
+
the more selective of the two, which is exactly the case the folklore rule gets
|
|
73
|
+
wrong.
|
|
74
|
+
|
|
31
75
|
## Query Optimization
|
|
32
76
|
|
|
33
77
|
### EXPLAIN analysis
|
|
34
78
|
|
|
35
|
-
| Column |
|
|
79
|
+
| Column | Value worth a second look | The question it raises |
|
|
36
80
|
|---|---|---|
|
|
37
|
-
| `type` | `ALL` | Full table scan — needs index |
|
|
38
81
|
| `rows` | High number | Too many rows examined |
|
|
39
82
|
| `Extra` | `Using filesort` | Sorting without index |
|
|
40
83
|
| `Extra` | `Using temporary` | Temp table — optimize GROUP BY/DISTINCT |
|
|
@@ -42,6 +85,22 @@ $table->index(['customer_id', 'created_at']);
|
|
|
42
85
|
|
|
43
86
|
Good values: `type` = `ref`, `eq_ref`, `const`; `Extra` = `Using index`.
|
|
44
87
|
|
|
88
|
+
**`type = ALL` is a full table scan, and a full table scan is often the correct
|
|
89
|
+
plan.** It belongs in no "bad value" column, because the row itself does not
|
|
90
|
+
decide:
|
|
91
|
+
|
|
92
|
+
- On a table small enough to sit in a page or two, the scan is **cheaper** than
|
|
93
|
+
an index lookup — the index costs a second read plus a row fetch per hit.
|
|
94
|
+
- On a predicate that matches a large fraction of the table, the planner picks
|
|
95
|
+
the scan **on purpose**; forcing an index there is slower, and many planners
|
|
96
|
+
will ignore the hint.
|
|
97
|
+
- On a table with hundreds of thousands of rows and a predicate matching a
|
|
98
|
+
handful, `ALL` is the defect.
|
|
99
|
+
|
|
100
|
+
The question to answer is *how many rows the predicate matches, out of how
|
|
101
|
+
many* — not whether `type` reads `ALL`. Compare the planner's `rows` estimate
|
|
102
|
+
against the table's size before concluding anything.
|
|
103
|
+
|
|
45
104
|
### Anti-patterns
|
|
46
105
|
|
|
47
106
|
| Anti-pattern | Fix |
|
|
@@ -49,9 +108,20 @@ Good values: `type` = `ref`, `eq_ref`, `const`; `Extra` = `Using index`.
|
|
|
49
108
|
| `SELECT *` in production | Select only needed columns |
|
|
50
109
|
| `LIKE '%search%'` | Fulltext search or `LIKE 'search%'` |
|
|
51
110
|
| `OFFSET` on large tables | Cursor pagination |
|
|
52
|
-
| Subquery in WHERE | Rewrite as JOIN |
|
|
53
111
|
| `ORDER BY RAND()` | Application-level randomization |
|
|
54
112
|
|
|
113
|
+
**Subqueries in `WHERE` are not on that list**, and the unconditional "rewrite
|
|
114
|
+
as a JOIN" they used to carry here was wrong more often than it was right:
|
|
115
|
+
|
|
116
|
+
| The subquery is | Do |
|
|
117
|
+
|---|---|
|
|
118
|
+
| **correlated** — it references the outer row, so it re-executes per row | rewrite as a JOIN, or as a derived table joined once. This is the case the folklore rule was built for |
|
|
119
|
+
| an **uncorrelated `IN` / `EXISTS`** | leave it. Planners flatten these into a semi-join already, and the hand-written JOIN often introduces the duplicate rows a semi-join was avoiding |
|
|
120
|
+
| a **bound on the driving set** — it produces a small list the outer query then filters on | leave it. Rewriting widens the driving set, which is the opposite of the intent |
|
|
121
|
+
|
|
122
|
+
Check the plan before rewriting: if the subquery already shows as a semi-join or
|
|
123
|
+
a materialized derived table executed once, the rewrite buys nothing and costs
|
|
124
|
+
correctness.
|
|
55
125
|
### Pagination
|
|
56
126
|
|
|
57
127
|
Always paginate list endpoints — never `get()` on unbounded queries:
|
|
@@ -68,10 +138,23 @@ $users = User::query()->orderBy('id')->cursorPaginate(15);
|
|
|
68
138
|
|
|
69
139
|
- Use `php artisan make:migration` to generate.
|
|
70
140
|
- Use `decimal` for money — never `float`.
|
|
71
|
-
- Add foreign keys with `constrained()
|
|
141
|
+
- Add foreign keys with `constrained()`, and **choose** the `onDelete()` action
|
|
142
|
+
rather than copying one: `cascade` when the child is expendable without its
|
|
143
|
+
parent, `restrict` when the child is a record in its own right (an invoice, an
|
|
144
|
+
audit row, a payment), `set null` when it survives the parent with the link
|
|
145
|
+
removed — which needs a nullable column. The decision table lives in
|
|
146
|
+
[`laravel-migration`](../../../src/skills/laravel-migration/SKILL.md)
|
|
147
|
+
§ Referential action is a decision.
|
|
72
148
|
- Always add indexes for searchable/filterable columns.
|
|
73
149
|
- One logical change per migration.
|
|
74
|
-
-
|
|
150
|
+
- **Declare recovery, always.** Either a `down()` that restores the prior state,
|
|
151
|
+
or — when restoration is genuinely impossible — a roll-forward plan written in
|
|
152
|
+
the migration file itself, naming why restoration is impossible with the
|
|
153
|
+
evidence, the ordered recovery steps and their inputs, the criteria that say
|
|
154
|
+
recovery succeeded, and the responsible owner. Silence is the violation, not
|
|
155
|
+
the absence of `down()`. Full contract:
|
|
156
|
+
[`laravel-migration`](../../../src/skills/laravel-migration/SKILL.md)
|
|
157
|
+
§ The recovery contract.
|
|
75
158
|
|
|
76
159
|
### Multi-connection migrations
|
|
77
160
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Prompt Templates
|
|
2
2
|
|
|
3
|
-
Reference catalogue of prompt structures the [`prompt-optimizer`](
|
|
3
|
+
Reference catalogue of prompt structures the [`prompt-optimizer`](../../src/skills/prompt-optimizer/SKILL.md)
|
|
4
4
|
skill picks from during the **Develop** step of the 4-D methodology.
|
|
5
|
-
Cited by the [`refine-prompt`](
|
|
5
|
+
Cited by the [`refine-prompt`](../../src/skills/refine-prompt/SKILL.md)
|
|
6
6
|
skill in `mini` mode for stack-aware shaping.
|
|
7
7
|
|
|
8
8
|
Templates are tools, not dogma. Pick by request type, not by upstream
|
|
@@ -108,7 +108,7 @@ warrants either reaction. The stance slot makes the honest-when-warranted
|
|
|
108
108
|
contract explicit.
|
|
109
109
|
|
|
110
110
|
**Package equivalents** — inside this agent-config, the
|
|
111
|
-
[`adversarial-review`](
|
|
111
|
+
[`adversarial-review`](../../src/skills/adversarial-review/SKILL.md)
|
|
112
112
|
skill implements the same stance via an Attack-Defend-Revise loop and is
|
|
113
113
|
the right tool when the user submits finished work for a critical take.
|
|
114
114
|
This template is for **end-users prompting their own LLM** (ChatGPT,
|
|
@@ -155,7 +155,7 @@ are slots the model cannot fill honestly.
|
|
|
155
155
|
The catalogue's own position: a template earns its place by making a
|
|
156
156
|
request *checkable*, not by making it sound authoritative. Where a rough
|
|
157
157
|
prompt carries one of these three, the
|
|
158
|
-
[`prompt-optimizer`](
|
|
158
|
+
[`prompt-optimizer`](../../src/skills/prompt-optimizer/SKILL.md)
|
|
159
159
|
strips it in its de-inflation sub-step before any template is picked —
|
|
160
160
|
and strips nothing else, because everything outside these three is a
|
|
161
161
|
requirement the author meant. This section is own analysis; it records a
|
|
@@ -183,7 +183,7 @@ membership.
|
|
|
183
183
|
|
|
184
184
|
## See also
|
|
185
185
|
|
|
186
|
-
- [`prompt-optimizer`](
|
|
187
|
-
- [`refine-prompt`](
|
|
188
|
-
- [`prompt-engineering-patterns`](
|
|
186
|
+
- [`prompt-optimizer`](../../src/skills/prompt-optimizer/SKILL.md) — engine-outbound; cites this catalogue in its Develop step
|
|
187
|
+
- [`refine-prompt`](../../src/skills/refine-prompt/SKILL.md) — engine-inbound; uses templates in `mini` mode for stack-aware shaping
|
|
188
|
+
- [`prompt-engineering-patterns`](../../src/skills/prompt-engineering-patterns/SKILL.md) — production-LLM prompt patterns (sibling skill, not a catalogue)
|
|
189
189
|
- AI Council session: `agents/runtime/council/responses/prompt-master-mini.json` (2026-05-17) <!-- council-ref-allowed: ADR decision trace -->
|
package/llms.txt
CHANGED
|
@@ -281,9 +281,9 @@ technical-specification: Use when the user says \"write a spec\", \"create RFC\"
|
|
|
281
281
|
terraform: Use when writing Terraform — AWS modules, resources, variables, outputs, remote state — even when the user just says 'provision this infra' or 'add an S3 bucket' without naming Terraform.
|
|
282
282
|
terragrunt: Use when working with Terragrunt — DRY multi-env configs, module dependencies, remote state orchestration — even when the user just says 'deploy this to staging and prod' without naming Terragrunt.
|
|
283
283
|
test-case-discovery: Use BEFORE writing any test — enumerate cases per behavior (happy / boundary / error / abuse), prioritize by likelihood × impact, cross-check via subagent — even if the user just says 'add tests'.
|
|
284
|
-
test-driven-development: Use when implementing a feature, fixing a bug, or refactoring — write
|
|
284
|
+
test-driven-development: Use when implementing a feature, fixing a bug, or refactoring — write the failing test first, then the code, even on 'add this function'. Owns the ORDER; test shape is `testing-anti-patterns`.
|
|
285
285
|
test-performance: Use when optimizing test suite performance — database setup, seeder optimization, parallel testing, CI pipeline efficiency, or RefreshDatabase alternatives.
|
|
286
|
-
testing-anti-patterns: Use BEFORE writing/changing tests
|
|
286
|
+
testing-anti-patterns: Use BEFORE writing/changing tests or adding mocks — mocking-the-mock, production pollution, overfit assertions — even on 'is this test any good?'. Test SHAPE; the order is `test-driven-development`.
|
|
287
287
|
threat-modeling: Use when adding auth, webhooks, uploads, queues, secrets, tenant boundaries, or public endpoints — produces trust boundaries + abuse cases mapped to files, BEFORE implementation.
|
|
288
288
|
throughput-vs-morale-tradeoff: Use when balancing eng-team velocity vs quality vs burnout — on-call load, focus fragmentation, reorg shock. Triggers on 'team is burning out', 'why is velocity dropping'.
|
|
289
289
|
token-optimizer: Use BEFORE any verbose CLI run, large file read, doc conversion, or near-context handoff — decision tree keyed by intent citing the canonical token-saving asset.
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@event4u/agent-config",
|
|
3
3
|
"mcpName": "io.github.event4u-app/agent-config",
|
|
4
|
-
"version": "14.
|
|
5
|
-
"description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) — every claim machine-checked, including
|
|
4
|
+
"version": "14.13.0",
|
|
5
|
+
"description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) — every claim machine-checked, including the counts in these badges.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"private": false,
|
|
8
8
|
"type": "module",
|
|
@@ -52,8 +52,11 @@
|
|
|
52
52
|
"AGENTS.md",
|
|
53
53
|
"CHANGELOG.md",
|
|
54
54
|
"CONTRIBUTING.md",
|
|
55
|
+
"CREDITS.md",
|
|
55
56
|
"LICENSE",
|
|
56
57
|
"MIGRATION.md",
|
|
58
|
+
"NOTICE",
|
|
59
|
+
"docs/THIRD-PARTY-NOTICES.md",
|
|
57
60
|
"README.md",
|
|
58
61
|
"llms.txt",
|
|
59
62
|
"!dist/**/*.test.js",
|
|
@@ -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
|