@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
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
* Flow:
|
|
17
17
|
*
|
|
18
18
|
* - `plan` outcome is not `success` → BLOCKED on precondition.
|
|
19
|
+
* - no RED evidence on `state.tests` → BLOCKED with
|
|
20
|
+
* `@agent-directive: observe-red` so the agent writes and observes the
|
|
21
|
+
* failing test for the next single behaviour BEFORE any production edit.
|
|
19
22
|
* - `state.changes` empty → BLOCKED with `@agent-directive:
|
|
20
23
|
* apply-plan` so the agent applies the plan.
|
|
21
24
|
* - `state.changes` populated but malformed (entries missing
|
|
@@ -26,6 +29,26 @@
|
|
|
26
29
|
* `docs/contracts/implement-ticket-flow.md#deliverystate-the-only-shared-object`
|
|
27
30
|
* — each entry is a dict with at least a `path`; optional
|
|
28
31
|
* `lines` / `purpose` feed the delivery report.
|
|
32
|
+
*
|
|
33
|
+
* RED evidence lives at `state.tests.red` and is the engine-side carrier for
|
|
34
|
+
* the test-first default in `rules/think-before-action.md`. Two accepted
|
|
35
|
+
* shapes, and nothing else counts:
|
|
36
|
+
*
|
|
37
|
+
* - one observation, or a list of them, each a dict with a non-empty
|
|
38
|
+
* `behaviour` and a `failure_class` from `_RED_FAILURE_CLASSES` — the three
|
|
39
|
+
* valid RED classes the `test-driven-development` skill admits (a failing
|
|
40
|
+
* assertion, a missing target, a contract failure). A broken fixture, a
|
|
41
|
+
* syntax error in the test, a missing unrelated dependency and a runner
|
|
42
|
+
* fault are NOT RED and are rejected by that same contract, not here.
|
|
43
|
+
* - `{exempt: "<reason>"}` — the recorded override for work the skill's
|
|
44
|
+
* *Do NOT use when* list already excludes (scaffolding, generated files,
|
|
45
|
+
* documentation). Recorded, never silent: an absent key is not an exemption.
|
|
46
|
+
*
|
|
47
|
+
* The gate is per behaviour, not per run: it names the behaviour it is waiting
|
|
48
|
+
* on and re-fires for the next one. It does NOT detect a batch — an agent that
|
|
49
|
+
* front-loads every test for the feature satisfies it, and the eval that fails
|
|
50
|
+
* a one-test-phase-then-one-code-phase plan is the control for that, not this
|
|
51
|
+
* step.
|
|
29
52
|
*/
|
|
30
53
|
|
|
31
54
|
import type { DeliveryState} from '../../delivery_state.js';
|
|
@@ -39,6 +62,13 @@ export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
|
|
|
39
62
|
trigger: '`plan` outcome is not `success`',
|
|
40
63
|
resolution: 're-run `/implement-ticket` from the start',
|
|
41
64
|
},
|
|
65
|
+
{
|
|
66
|
+
code: 'no_red_evidence',
|
|
67
|
+
trigger: '`state.tests.red` carries neither an observed failing test for a ' +
|
|
68
|
+
'behaviour nor a recorded exemption',
|
|
69
|
+
resolution: 'agent directive `observe-red` → write the failing test for the ' +
|
|
70
|
+
'next single behaviour, observe it fail, record it',
|
|
71
|
+
},
|
|
42
72
|
{
|
|
43
73
|
code: 'empty_changes_delegate',
|
|
44
74
|
trigger: '`state.changes` empty — plan not applied yet',
|
|
@@ -68,6 +98,13 @@ export function run(state: DeliveryState): StepResult {
|
|
|
68
98
|
return _blocked_on_precondition(state);
|
|
69
99
|
}
|
|
70
100
|
|
|
101
|
+
// Test-first, enforced where the engine can see it: no production work is
|
|
102
|
+
// emitted for a behaviour whose failing test has not been observed.
|
|
103
|
+
const redIssue = _diagnose_red(state.tests);
|
|
104
|
+
if (redIssue !== null) {
|
|
105
|
+
return _blocked_on_missing_red(state, redIssue);
|
|
106
|
+
}
|
|
107
|
+
|
|
71
108
|
if (!_pyTruthy(state.changes)) {
|
|
72
109
|
return _delegate_to_apply_plan(state);
|
|
73
110
|
}
|
|
@@ -98,6 +135,59 @@ function _diagnose_changes(changes: Any[]): string[] {
|
|
|
98
135
|
return issues;
|
|
99
136
|
}
|
|
100
137
|
|
|
138
|
+
/** The three RED classes the `test-driven-development` mode contract admits. */
|
|
139
|
+
const _RED_FAILURE_CLASSES = ['assertion', 'missing_target', 'contract'] as const;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* `null` when `state.tests` carries usable RED evidence, else the complaint.
|
|
143
|
+
*
|
|
144
|
+
* Absent is a complaint, not an exemption — the whole point of the gate.
|
|
145
|
+
*/
|
|
146
|
+
function _diagnose_red(tests: Any): string | null {
|
|
147
|
+
if (!_isPlainObject(tests)) {
|
|
148
|
+
return 'no `state.tests.red` recorded';
|
|
149
|
+
}
|
|
150
|
+
const red = (tests as Record<string, unknown>).red;
|
|
151
|
+
if (!_pyTruthy(red)) {
|
|
152
|
+
return 'no `state.tests.red` recorded';
|
|
153
|
+
}
|
|
154
|
+
if (_isPlainObject(red) && _pyTruthy((red as Record<string, unknown>).exempt)) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const observations = Array.isArray(red) ? red : [red];
|
|
158
|
+
for (const obs of observations) {
|
|
159
|
+
if (!_isPlainObject(obs)) {
|
|
160
|
+
return 'a `red` observation is not a dict';
|
|
161
|
+
}
|
|
162
|
+
const o = obs as Record<string, unknown>;
|
|
163
|
+
if (typeof o.behaviour !== 'string' || _pyStrip(o.behaviour).length === 0) {
|
|
164
|
+
return 'a `red` observation names no `behaviour`';
|
|
165
|
+
}
|
|
166
|
+
if (!_RED_FAILURE_CLASSES.includes(o.failure_class as (typeof _RED_FAILURE_CLASSES)[number])) {
|
|
167
|
+
return (
|
|
168
|
+
`\`red\` observation for \`${_pyStrip(o.behaviour)}\` has ` +
|
|
169
|
+
`\`failure_class\` outside ${_RED_FAILURE_CLASSES.join(', ')}`
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function _blocked_on_missing_red(state: DeliveryState, issue: string): StepResult {
|
|
177
|
+
const ticketId = _ticketId(state);
|
|
178
|
+
return new StepResult({
|
|
179
|
+
outcome: Outcome.BLOCKED,
|
|
180
|
+
questions: [
|
|
181
|
+
agent_directive('observe-red', { ticket: ticketId }),
|
|
182
|
+
`> Ticket ${ticketId} — implement gate refused: ${issue}. Write the ` +
|
|
183
|
+
'failing test for the next single behaviour and observe it fail first.',
|
|
184
|
+
'> 1. Continue — write and run that one failing test',
|
|
185
|
+
'> 2. Record an exemption — `state.tests.red = {exempt: "<reason>"}`',
|
|
186
|
+
],
|
|
187
|
+
message: `Ticket ${ticketId} needs an observed failing test before production work: ${issue}.`,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
101
191
|
function _delegate_to_apply_plan(state: DeliveryState): StepResult {
|
|
102
192
|
const ticketId = _ticketId(state);
|
|
103
193
|
return new StepResult({
|
|
@@ -45,6 +45,17 @@ export const SUPPORTED_KINDS: ReadonlyArray<string> = ['ticket', 'prompt'];
|
|
|
45
45
|
// test, verify, report). The leaf name is the dispatcher slot key; in Python
|
|
46
46
|
// it is derived via `step.__name__.rsplit(".", 1)[-1]` — hardcoded here since
|
|
47
47
|
// the modules are imported statically.
|
|
48
|
+
//
|
|
49
|
+
// `implement` stays BEFORE `test`, deliberately, and the order is not the
|
|
50
|
+
// test-after instruction it looks like. The tuple is linear and runs once per
|
|
51
|
+
// flow, so moving `test` in front of `implement` would buy exactly one test
|
|
52
|
+
// phase followed by one code phase — batch-TDD, which is the second
|
|
53
|
+
// anti-pattern rather than a fix for the first. Test-first is enforced INSIDE
|
|
54
|
+
// `implement` instead: `./implement.ts` refuses to emit production work for a
|
|
55
|
+
// behaviour whose failing test has not been observed (`state.tests.red`), so
|
|
56
|
+
// the discipline is per behaviour while the tuple stays per flow. The `test`
|
|
57
|
+
// slot here is the whole-suite verdict that gates `verify`, never the first
|
|
58
|
+
// time a test is written.
|
|
48
59
|
const _STEPS: ReadonlyArray<[string, { run: Step; AMBIGUITIES: ReadonlyArray<Record<string, string>> }]> = [
|
|
49
60
|
['refine', refine],
|
|
50
61
|
['memory', memory],
|
|
@@ -25,6 +25,13 @@
|
|
|
25
25
|
* be silently skipped, and the loop cannot report one as success.
|
|
26
26
|
* - Optional keys (`targeted`, `full`, `duration_ms`,
|
|
27
27
|
* `followups`) feed the delivery report.
|
|
28
|
+
* - `red` is NOT a verdict. It is the per-behaviour RED evidence
|
|
29
|
+
* `./implement.ts` gates on, written before any production edit, and it
|
|
30
|
+
* says nothing about the suite. A `state.tests` carrying `red` and no
|
|
31
|
+
* `verdict` therefore means the runner has not been invoked for the suite
|
|
32
|
+
* yet → delegate, exactly as an empty `state.tests` does. A `verdict` that
|
|
33
|
+
* is present and unrecognised still blocks on shape; this is a
|
|
34
|
+
* not-yet-run case, never a relaxed verdict check.
|
|
28
35
|
*/
|
|
29
36
|
|
|
30
37
|
import type { DeliveryState} from '../../delivery_state.js';
|
|
@@ -86,7 +93,7 @@ export function run(state: DeliveryState): StepResult {
|
|
|
86
93
|
}
|
|
87
94
|
|
|
88
95
|
const tests = state.tests;
|
|
89
|
-
if (!_pyTruthy(tests)) {
|
|
96
|
+
if (!_pyTruthy(tests) || _isRedOnly(tests)) {
|
|
90
97
|
return _delegate_to_run_tests(state, policy.widen_tests);
|
|
91
98
|
}
|
|
92
99
|
|
|
@@ -104,6 +111,21 @@ export function run(state: DeliveryState): StepResult {
|
|
|
104
111
|
return new StepResult({ outcome: Outcome.SUCCESS });
|
|
105
112
|
}
|
|
106
113
|
|
|
114
|
+
/**
|
|
115
|
+
* True when `state.tests` carries only the pre-implement RED record.
|
|
116
|
+
*
|
|
117
|
+
* `red` is written by the `implement` gate's `observe-red` directive; it is
|
|
118
|
+
* evidence about one behaviour's first failing run, not a suite verdict. Only
|
|
119
|
+
* a MISSING `verdict` routes here — a present-but-wrong one still blocks.
|
|
120
|
+
*/
|
|
121
|
+
function _isRedOnly(tests: Any): boolean {
|
|
122
|
+
if (!_isPlainObject(tests)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const d = tests as Record<string, unknown>;
|
|
126
|
+
return !('verdict' in d) && _pyTruthy(d.red);
|
|
127
|
+
}
|
|
128
|
+
|
|
107
129
|
function _diagnose_tests(tests: Any): string[] {
|
|
108
130
|
if (!_isPlainObject(tests)) {
|
|
109
131
|
return [`state.tests must be a dict, got ${_pyTypeName(tests)}`];
|
|
@@ -33,7 +33,16 @@ import { type Any, Outcome, StepResult, agent_directive } from '../../delivery_s
|
|
|
33
33
|
import { resolve_policy } from '../../persona_policy.js';
|
|
34
34
|
import { decide, partial_exit, record_attempt, retry_halt, unmet_dod, verdict_signature } from './_self_fix.js';
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
/**
|
|
37
|
+
* DERIVED, never re-declared. `delivery_state.ts` is the step vocabulary's
|
|
38
|
+
* declaration for the template tree (templates are self-contained by contract
|
|
39
|
+
* and may not import from `src/scripts/`, so the registry mirrors it rather
|
|
40
|
+
* than the other way round). Spelling the three values again here made this the
|
|
41
|
+
* THIRD copy, and a third copy is how one vocabulary becomes two truths --
|
|
42
|
+
* which is the defect the outcome-vocabulary reconciliation was opened to fix.
|
|
43
|
+
* Found by the widened duplicate detector, 2026-08-30.
|
|
44
|
+
*/
|
|
45
|
+
const _ALLOWED_VERDICTS = Object.values(Outcome) as ReadonlyArray<Outcome>;
|
|
37
46
|
|
|
38
47
|
/** Declared ambiguity surfaces. Advisory personas skip this step entirely. */
|
|
39
48
|
export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
|
|
@@ -20,7 +20,11 @@ import {
|
|
|
20
20
|
/** Agent directive that drives end-to-end smoke scenarios. */
|
|
21
21
|
export const INTEGRATION_TEST_DIRECTIVE = 'integration-test';
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
/**
|
|
24
|
+
* DERIVED, never re-declared — see the note in `directives/backend/verify.ts`.
|
|
25
|
+
* This was the fourth copy of the step vocabulary.
|
|
26
|
+
*/
|
|
27
|
+
const _ALLOWED_VERDICTS: ReadonlyArray<string> = Object.values(Outcome);
|
|
24
28
|
|
|
25
29
|
export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
|
|
26
30
|
{
|
|
@@ -236,7 +236,7 @@ export function resolve_toolchain(
|
|
|
236
236
|
quality.push(..._php_quality(project_root, composer, wrappers));
|
|
237
237
|
}
|
|
238
238
|
if (has_package) {
|
|
239
|
-
runners.push(..._js_runners(pkg, wrappers));
|
|
239
|
+
runners.push(..._js_runners(pkg, wrappers, _package_manager(project_root, pkg)));
|
|
240
240
|
quality.push(..._js_quality(pkg, wrappers));
|
|
241
241
|
}
|
|
242
242
|
if (has_python) {
|
|
@@ -347,7 +347,7 @@ function _php_runners(root: string, composer: Manifest, wrappers: Wrappers): Run
|
|
|
347
347
|
];
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
function _js_runners(pkg: Manifest, wrappers: Wrappers): RunnerResult[] {
|
|
350
|
+
function _js_runners(pkg: Manifest, wrappers: Wrappers, manager: string): RunnerResult[] {
|
|
351
351
|
const deps = _all_dependencies(
|
|
352
352
|
pkg,
|
|
353
353
|
'dependencies',
|
|
@@ -383,17 +383,17 @@ function _js_runners(pkg: Manifest, wrappers: Wrappers): RunnerResult[] {
|
|
|
383
383
|
|
|
384
384
|
// e2e runner — separate bucket, excluded unless --include-e2e.
|
|
385
385
|
if ('@playwright/test' in deps || 'playwright' in deps) {
|
|
386
|
-
const cmd = _script_command(scripts, ['test:e2e', 'e2e', 'playwright']) || 'npx playwright test';
|
|
386
|
+
const cmd = _script_command(scripts, ['test:e2e', 'e2e', 'playwright'], manager) || 'npx playwright test';
|
|
387
387
|
out.push(
|
|
388
388
|
new RunnerResult('js', 'playwright', cmd, SPEED_E2E, HIGH, '@playwright/test in package deps'),
|
|
389
389
|
);
|
|
390
390
|
} else if ('cypress' in deps) {
|
|
391
|
-
const cmd = _script_command(scripts, ['test:e2e', 'e2e', 'cypress']) || 'npx cypress run';
|
|
391
|
+
const cmd = _script_command(scripts, ['test:e2e', 'e2e', 'cypress'], manager) || 'npx cypress run';
|
|
392
392
|
out.push(new RunnerResult('js', 'cypress', cmd, SPEED_E2E, HIGH, 'cypress in package deps'));
|
|
393
393
|
}
|
|
394
394
|
|
|
395
395
|
// slow bucket — an explicit slow/integration script.
|
|
396
|
-
const slow_cmd = _script_command(scripts, ['test:slow', 'test:integration']);
|
|
396
|
+
const slow_cmd = _script_command(scripts, ['test:slow', 'test:integration'], manager);
|
|
397
397
|
if (slow_cmd) {
|
|
398
398
|
out.push(
|
|
399
399
|
new RunnerResult(
|
|
@@ -487,19 +487,100 @@ function _task_runner_wrappers(root: string, pkg: Manifest): Wrappers {
|
|
|
487
487
|
}
|
|
488
488
|
const scripts: Manifest = _isDict(pkg.scripts) ? pkg.scripts : {};
|
|
489
489
|
if (_isDict(scripts) && 'test' in scripts) {
|
|
490
|
-
out['js-test'] = `${_package_manager(root)} test`;
|
|
490
|
+
out['js-test'] = `${_package_manager(root, pkg)} test`;
|
|
491
491
|
}
|
|
492
492
|
return out;
|
|
493
493
|
}
|
|
494
494
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
495
|
+
/**
|
|
496
|
+
* Lockfile → manager, in the order `monorepo-workspace/SKILL.md` § 1 states.
|
|
497
|
+
* Kept as data rather than a chain of ifs so `PACKAGE_MANAGER_BRANCHES` below
|
|
498
|
+
* can assert the count against the documented one.
|
|
499
|
+
*/
|
|
500
|
+
const LOCKFILE_MANAGERS: ReadonlyArray<readonly [string, string]> = [
|
|
501
|
+
['pnpm-lock.yaml', 'pnpm'],
|
|
502
|
+
['yarn.lock', 'yarn'],
|
|
503
|
+
['bun.lock', 'bun'],
|
|
504
|
+
['bun.lockb', 'bun'],
|
|
505
|
+
['package-lock.json', 'npm'],
|
|
506
|
+
];
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* The five branches `monorepo-workspace/SKILL.md` § 1 specifies, named so a
|
|
510
|
+
* test can assert none went missing. The skill is the contract and it was
|
|
511
|
+
* already correct; this list exists because the code implemented three of the
|
|
512
|
+
* five and nothing noticed.
|
|
513
|
+
*/
|
|
514
|
+
export const PACKAGE_MANAGER_BRANCHES: readonly string[] = [
|
|
515
|
+
'packageManager',
|
|
516
|
+
'pnpm',
|
|
517
|
+
'yarn',
|
|
518
|
+
'bun',
|
|
519
|
+
'npm',
|
|
520
|
+
] as const;
|
|
521
|
+
|
|
522
|
+
export interface PackageManagerResolution {
|
|
523
|
+
/** The resolved manager, or `null` when the cascade deliberately refuses. */
|
|
524
|
+
manager: string | null;
|
|
525
|
+
/** Which branch answered — one of `PACKAGE_MANAGER_BRANCHES`, or `'ambiguous'`. */
|
|
526
|
+
via: string;
|
|
527
|
+
/** Non-empty when the cascade refuses: the reported finding. */
|
|
528
|
+
finding: string;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Resolve the package manager per `monorepo-workspace/SKILL.md` § 1.
|
|
533
|
+
*
|
|
534
|
+
* Two behaviours the previous three-branch version did not have, and both are
|
|
535
|
+
* in the skill rather than invented here:
|
|
536
|
+
*
|
|
537
|
+
* - `packageManager` in the root `package.json` is the DECLARATION and wins
|
|
538
|
+
* when present, because it is what Corepack enforces. A lockfile is an
|
|
539
|
+
* inference; a declaration is not.
|
|
540
|
+
* - **Two lockfiles is a finding, not a tie to break.** The old code returned
|
|
541
|
+
* `pnpm` for a repository carrying both `pnpm-lock.yaml` and `yarn.lock`,
|
|
542
|
+
* silently picking the first branch it tested. That is a guess presented as
|
|
543
|
+
* an answer, and the skill says to report both and stop.
|
|
544
|
+
*/
|
|
545
|
+
export function _resolve_package_manager(
|
|
546
|
+
root: string,
|
|
547
|
+
pkg?: Manifest,
|
|
548
|
+
): PackageManagerResolution {
|
|
549
|
+
const declared = pkg === undefined ? undefined : pkg['packageManager'];
|
|
550
|
+
if (typeof declared === 'string' && declared.trim() !== '') {
|
|
551
|
+
// `pnpm@9.1.0` → `pnpm`. Corepack's own format.
|
|
552
|
+
const name = declared.trim().split('@')[0] as string;
|
|
553
|
+
if (name !== '') {
|
|
554
|
+
return { manager: name, via: 'packageManager', finding: '' };
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
const present = LOCKFILE_MANAGERS.filter(([file]) => _is_file(path.join(root, file)));
|
|
558
|
+
const distinct = [...new Set(present.map(([, mgr]) => mgr))];
|
|
559
|
+
if (distinct.length > 1) {
|
|
560
|
+
return {
|
|
561
|
+
manager: null,
|
|
562
|
+
via: 'ambiguous',
|
|
563
|
+
finding:
|
|
564
|
+
`two package-manager lockfiles present (${present.map(([f]) => f).join(', ')}) ` +
|
|
565
|
+
'and no `packageManager` declaration — report both and stop, per ' +
|
|
566
|
+
'monorepo-workspace SKILL.md § 1',
|
|
567
|
+
};
|
|
498
568
|
}
|
|
499
|
-
if (
|
|
500
|
-
|
|
569
|
+
if (distinct.length === 1) {
|
|
570
|
+
const mgr = distinct[0] as string;
|
|
571
|
+
return { manager: mgr, via: mgr, finding: '' };
|
|
501
572
|
}
|
|
502
|
-
return 'npm';
|
|
573
|
+
return { manager: 'npm', via: 'npm', finding: '' };
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* The resolved manager as a bare string for command construction. Falls back to
|
|
578
|
+
* `npm` on the ambiguous case so a caller building a command string still gets
|
|
579
|
+
* one — the FINDING is what carries the ambiguity, and a caller that needs it
|
|
580
|
+
* calls `_resolve_package_manager` directly.
|
|
581
|
+
*/
|
|
582
|
+
function _package_manager(root: string, pkg?: Manifest): string {
|
|
583
|
+
return _resolve_package_manager(root, pkg).manager ?? 'npm';
|
|
503
584
|
}
|
|
504
585
|
|
|
505
586
|
// --------------------------------------------------------------------------
|
|
@@ -580,10 +661,17 @@ function _script_uses(scripts: Manifest, name: string, tool: string): boolean {
|
|
|
580
661
|
return typeof value === 'string' && value.includes(tool);
|
|
581
662
|
}
|
|
582
663
|
|
|
583
|
-
|
|
664
|
+
/**
|
|
665
|
+
* Build a `<manager> run <script>` command for the first matching script name.
|
|
666
|
+
*
|
|
667
|
+
* `manager` used to be hardcoded `npm`. Every command the work engine hands an
|
|
668
|
+
* agent for verification inherited that, so a pnpm or yarn repository was told
|
|
669
|
+
* to run a command its lockfile contradicts.
|
|
670
|
+
*/
|
|
671
|
+
function _script_command(scripts: Manifest, names: string[], manager: string): string {
|
|
584
672
|
for (const name of names) {
|
|
585
673
|
if (typeof scripts[name] === 'string') {
|
|
586
|
-
return
|
|
674
|
+
return `${manager} run ${name}`;
|
|
587
675
|
}
|
|
588
676
|
}
|
|
589
677
|
return '';
|
|
@@ -1264,6 +1264,31 @@ hooks:
|
|
|
1264
1264
|
rtk_wrap:
|
|
1265
1265
|
enabled: false
|
|
1266
1266
|
|
|
1267
|
+
# Runtime event journal (road-to-runtime-event-journal Phase 1, step 1.4).
|
|
1268
|
+
# Default-OFF. When enabled, the `journal-record` concern appends one
|
|
1269
|
+
# durable, episode-keyed event record per dispatched hook event to
|
|
1270
|
+
# `<git-common-dir>/agent-journal/journal.sqlite` — a Class-A write that
|
|
1271
|
+
# opens, writes and exits. It emits nothing to the model, never warns and
|
|
1272
|
+
# never blocks: a locked database, a missing `node:sqlite`, a malformed
|
|
1273
|
+
# envelope or a full disk all degrade to silence.
|
|
1274
|
+
#
|
|
1275
|
+
# OFF rather than ON — unlike the sibling append-a-JSONL instruments — because
|
|
1276
|
+
# this one CREATES a storage surface (a SQLite database and a directory under
|
|
1277
|
+
# your `.git/`) rather than appending to a gitignored directory that already
|
|
1278
|
+
# exists. ADR-124 § 3's default-off floor for engine-shaped state is not
|
|
1279
|
+
# superseded by ADR-249.
|
|
1280
|
+
#
|
|
1281
|
+
# The record type has no field able to hold free-form content: ids, an event
|
|
1282
|
+
# name, a bounded capability identifier, repo-relative locators, and two
|
|
1283
|
+
# 12-hex digests (`repository_id`, `worktree_id`). No prompt, no file body, no
|
|
1284
|
+
# absolute path — enforced by a committed key set, a compile-time guard and a
|
|
1285
|
+
# write-time value check, not by a scrubbing pass.
|
|
1286
|
+
#
|
|
1287
|
+
# Retention: a 30-day TTL anchored on episode close, plus explicit,
|
|
1288
|
+
# time-bounded, human-only holds that themselves expire (180 days).
|
|
1289
|
+
runtime_journal:
|
|
1290
|
+
enabled: false
|
|
1291
|
+
|
|
1267
1292
|
# PreToolUse anti-slop nudge (road-to-anti-slop-detector Phase 3). Default-OFF.
|
|
1268
1293
|
# When enabled, runs the lint_design_slop registry against about-to-be-written
|
|
1269
1294
|
# UI content (html/css/jsx/…) and WARNS (exit 2, never blocks) on P0/P1
|
|
@@ -1330,9 +1355,13 @@ hooks:
|
|
|
1330
1355
|
# benchmark measured the native graph at recall 0.365 vs grep 0.797 on
|
|
1331
1356
|
# graph-shaped questions across 3 real repos (internal/bench/reports/
|
|
1332
1357
|
# code-graph-vs-grep.md; claim code-graph-retrieval-null). `enabled: false`
|
|
1333
|
-
# is
|
|
1334
|
-
#
|
|
1335
|
-
# and
|
|
1358
|
+
# is the DEFAULT and is not permanent — the removal commitment this comment
|
|
1359
|
+
# used to carry was withdrawn on 2026-08-15 (docs/MIGRATION.md, the code_graph
|
|
1360
|
+
# row), and "permanent" was retracted with it. What holds is the default and
|
|
1361
|
+
# its reopen condition, which is the same one that was always written here:
|
|
1362
|
+
# external evidence — a consumer case the graph answers and disciplined grep
|
|
1363
|
+
# cannot — or a re-measurement on a build that postdates the extractor repair
|
|
1364
|
+
# of 2026-08-22, which the 2026-07-28 figures predate.
|
|
1336
1365
|
#
|
|
1337
1366
|
# The engine's parser pair is NO LONGER a runtime dependency (~51 MB that
|
|
1338
1367
|
# every consumer installed for a path none of them can reach); it is a
|
|
@@ -7,10 +7,20 @@
|
|
|
7
7
|
"grader": {
|
|
8
8
|
"path": "src/scripts/grade_target_readiness.ts",
|
|
9
9
|
"dimensions": 10,
|
|
10
|
-
"knockouts": [
|
|
10
|
+
"knockouts": [
|
|
11
|
+
"test-presence",
|
|
12
|
+
"static-analysis",
|
|
13
|
+
"security-supply-chain",
|
|
14
|
+
"ci-enforcement"
|
|
15
|
+
],
|
|
11
16
|
"note": "Grades 0 Absent / 1 Present / 2 Enforced-in-CI / 3 Independent-and-diff-scoped, verdict `min` over the four knockouts, printed as `L<n> — bound by <dimension>`. Emits no aggregate figure — a test greps its own output for `%` and `/100`. `null` is 'this tool cannot tell' and is NOT a zero; on a knockout it binds at L0 with its reason printed."
|
|
12
17
|
},
|
|
13
|
-
"state_vocabulary": [
|
|
18
|
+
"state_vocabulary": [
|
|
19
|
+
"available",
|
|
20
|
+
"missing",
|
|
21
|
+
"degraded",
|
|
22
|
+
"unknown"
|
|
23
|
+
],
|
|
14
24
|
"capabilities": {
|
|
15
25
|
"unit-test": {
|
|
16
26
|
"axis": "target",
|
|
@@ -53,30 +63,32 @@
|
|
|
53
63
|
"owner_surface": "src/skills/test-driven-development/SKILL.md",
|
|
54
64
|
"projection": null,
|
|
55
65
|
"state": "available",
|
|
56
|
-
"rationale": "
|
|
57
|
-
"evidence": "src/
|
|
58
|
-
"revisit_if": "
|
|
66
|
+
"rationale": "Was `projection: null` on the rationale that \"an observed failing test is a fact about a run, and no repository scan can recover it\". That held until 2026-08-26, when this entry's own `revisit_if` fired: `src/scripts/_lib/test_red_state.ts` now emits a durable RED-run record carrying the target, the observed failure CLASS, and a run identifier a later reader can cite. The classification stays the TDD skill's -- the store records the class the caller observed and never decides it, because a store that classified would be a second opinion competing with the contract. `projection` stays null on the contract's own terms: it names a grader DIMENSION, and `grade_target_readiness` reads a target repository, while this record is gitignored per-run state at `agents/runtime/state/test-results.json` on the machine that ran the test. An `axis: self` fact no shipped probe can read off a target is exactly the null case. Still owned by the RED -> GREEN -> REFACTOR cycle; what changed is that the cycle now leaves a trace.",
|
|
67
|
+
"evidence": "src/scripts/_lib/test_red_state.ts + tests/scripts/test_red_state.test.ts (22 tests). The load-bearing half is the invalid set: a broken fixture, a test syntax error, a missing unrelated dependency and a runner fault are recorded and marked NOT a valid red, so a production edit cannot be cleared by a failure that was never about the behaviour under test. Sensitivity proven -- admitting `broken-fixture` to the valid set turns 4 of the 22 red.",
|
|
68
|
+
"revisit_if": "The record is gitignored per-run state, so it proves a red was observed on THIS machine and nothing about CI or another developer. Revisit if a cross-machine claim is ever wanted: that needs a tracked artefact, which is a different decision under ADR-124 and not this entry's to make. Also revisit if a consumer of the record starts fuzzy-matching targets -- exact match is what stops a red observed for one behaviour clearing an edit to another."
|
|
59
69
|
},
|
|
60
70
|
"mutation-sensitivity": {
|
|
61
71
|
"axis": "target",
|
|
62
72
|
"owner_surface": "src/scripts/grade_target_readiness.ts",
|
|
63
|
-
"projection": "
|
|
73
|
+
"projection": "advanced-testing-signals",
|
|
64
74
|
"state": "degraded",
|
|
65
75
|
"limitations": [
|
|
66
76
|
"detection only — the grader reads stryker/infection/mutmut config presence and never runs a mutation pass",
|
|
77
|
+
"the projected dimension is UNSCORED as of 2026-08-27 \u2014 `advanced-testing-signals` emits `grade: null` plus an `observations` array, because config presence orders targets by adoption and was being read as effectiveness",
|
|
78
|
+
"the CI observation is `mutation-testing-ci-reference-detected`, never `-enforcement-`: static matching over a workflow file establishes that a mutation tool is REFERENCED there, and cannot establish that the step is enabled, blocking, reached on the required branches, or ever executed. Renamed 2026-08-27 after an independent cross-model review found the original name handed a consumer an assurance token the probe does not earn",
|
|
67
79
|
"no universal min-MSI constant exists here and none may be added (AC-8)",
|
|
68
80
|
"a tool-assisted rig for THIS package was refused on measured grounds by the sibling roadmap"
|
|
69
81
|
],
|
|
70
82
|
"rationale": "Config presence is detected; sensitivity is never measured by this tree. For AC's own suite the manual control-inversion probe in testing-anti-patterns is the substitute, and it is a named substitute rather than a silent one.",
|
|
71
83
|
"evidence": "src/skills/testing-anti-patterns/SKILL.md:185 — 'No mutation-testing rig required: comment the control out, run that one spec, put it back.' · agents/roadmaps/archive/road-to-test-independence-and-mutation-evidence.md — rig REFUSED (measured), 10 hand probes in minutes",
|
|
72
|
-
"revisit_if": "a mutation adapter ships that runs a changed-surface pass and reports survivors and timeouts separately"
|
|
84
|
+
"revisit_if": "a mutation adapter ships that runs a changed-surface pass and reports survivors and timeouts separately — but read this as a DESCRIPTION of what would lift the degraded state, never as authorization to build one. Council 2026-08-27 (anthropic + openai, 2/2 convergent) applied the mechanism-match test and found a changed-surface adapter to be the SAME mechanism the sibling roadmap measured and refused; changed-surface narrows the scope, which weakens the automation case rather than strengthening it. The governing condition is that refusal's own: a survivor population too large to hand-probe. Nothing has measured one."
|
|
73
85
|
},
|
|
74
86
|
"property-test": {
|
|
75
87
|
"axis": "target",
|
|
76
88
|
"owner_surface": "src/scripts/grade_target_readiness.ts",
|
|
77
|
-
"projection": "
|
|
89
|
+
"projection": "advanced-testing-signals",
|
|
78
90
|
"state": "available",
|
|
79
|
-
"rationale": "fast-check and Hypothesis are probed as property-based libraries.",
|
|
91
|
+
"rationale": "fast-check and Hypothesis are probed as property-based libraries. Probed and reported, never graded: since 2026-08-27 the projected dimension emits the observation `property-testing-library-detected` and no grade, because a declared dependency does not establish that any property test was written or run.",
|
|
80
92
|
"evidence": "src/scripts/grade_target_readiness.ts — 'fast-check' and 'hypothesis' tokens present; asserted > 0 in the full fixture",
|
|
81
93
|
"revisit_if": "the probe stops distinguishing a present property library from an absent one"
|
|
82
94
|
},
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Canonical terms — the house dialect for repository-authored prose.
|
|
2
|
+
# road-to-canonical-terms Phase 1.1. AI council 2/2, 2026-08-25.
|
|
3
|
+
#
|
|
4
|
+
# WHAT THIS FILE DECIDES, AND WHAT IT DOES NOT.
|
|
5
|
+
# It records the canonical side of each measured pair. It does NOT authorise a
|
|
6
|
+
# sweep of the existing corpus. Both council seats separated the two
|
|
7
|
+
# deliberately: choosing a canonical dialect and rewriting ~5000 historical
|
|
8
|
+
# occurrences have different evidentiary requirements, and only the first is
|
|
9
|
+
# supported today. `policy_scope` below states that boundary in the data rather
|
|
10
|
+
# than only in prose, so a future reader cannot take this file for authorisation.
|
|
11
|
+
#
|
|
12
|
+
# WHY AMERICAN, WHEN THE PUBLISHED AGGREGATE SAID BRITISH.
|
|
13
|
+
# The roadmap's Phase 1.1 rests on `behaviour`/`behavior` splitting 57/43 with
|
|
14
|
+
# the BRITISH side ahead, calling it a case where the majority rule and the
|
|
15
|
+
# consistency rule point in opposite directions. Decomposed by directory, they
|
|
16
|
+
# do not point in opposite directions at all:
|
|
17
|
+
#
|
|
18
|
+
# src/ 128 behaviour / 432 behavior -> 22/78 AMERICAN
|
|
19
|
+
# docs/ 304 / 189 -> 61/39
|
|
20
|
+
# agents/ 971 / 419 -> 69/31
|
|
21
|
+
#
|
|
22
|
+
# The British majority is produced almost entirely by `agents/` -- roadmaps,
|
|
23
|
+
# evidence notes and archive, i.e. this repository's own working prose, much of
|
|
24
|
+
# it in files nobody will edit again. On the SHIPPED surface the tree is already
|
|
25
|
+
# 78 % American. So this file documents existing practice where it matters
|
|
26
|
+
# rather than imposing a rewrite, which is also the strongest answer to the
|
|
27
|
+
# seat that asked for evidence of harm before authorising 5000 changed lines:
|
|
28
|
+
# declaring the convention `src/` already follows costs nothing and changes no
|
|
29
|
+
# file.
|
|
30
|
+
#
|
|
31
|
+
# Full decomposition, including the two other pairs that flip between the
|
|
32
|
+
# shipped surface and the aggregate (`artifact`/`artefact` and
|
|
33
|
+
# `preflight`/`pre-flight`), is the CORRECTION section of
|
|
34
|
+
# agents/evidence/analysis/wording-baseline-2026-08-25.md.
|
|
35
|
+
schema_version: canonical-terms-v1
|
|
36
|
+
|
|
37
|
+
policy_scope: prose-authored-here
|
|
38
|
+
# `prose-authored-here` -- the canonical side applies to prose THIS repository
|
|
39
|
+
# writes. It never applies to: exact external titles and quotations, code,
|
|
40
|
+
# identifiers, paths, URLs, commands, test fixtures, snapshots, or externally
|
|
41
|
+
# synchronised material. The council's wording, adopted verbatim in intent:
|
|
42
|
+
# do NOT exempt ordinary prose merely because it sits near protected text.
|
|
43
|
+
|
|
44
|
+
sweep_authorised: false
|
|
45
|
+
# Set true only when a classified inventory and a bounded pilot exist. The
|
|
46
|
+
# conditions are recorded at the roadmap's step 2.1; this key exists so a gate
|
|
47
|
+
# or a future session reads the answer rather than inferring it from silence.
|
|
48
|
+
|
|
49
|
+
terms:
|
|
50
|
+
# --- decided, and the direction is the same in src/, docs/ and agents/ ---
|
|
51
|
+
- canonical: subagent
|
|
52
|
+
variant: sub-agent
|
|
53
|
+
confidence: unambiguous
|
|
54
|
+
note: 98/2 in src/, 99/1 in docs/ and agents/. No directory disagrees.
|
|
55
|
+
- canonical: handoff
|
|
56
|
+
variant: hand-off
|
|
57
|
+
confidence: unambiguous
|
|
58
|
+
note: >-
|
|
59
|
+
84/16 in src/, 85/15 in docs/, 95/5 in agents/. `hand off` as two words is
|
|
60
|
+
a verb phrase and is not a variant of the noun; it is out of scope here.
|
|
61
|
+
- canonical: organize
|
|
62
|
+
variant: organise
|
|
63
|
+
confidence: unambiguous
|
|
64
|
+
note: >-
|
|
65
|
+
100/0 in src/ and docs/. agents/ is 53/47 on n=13, which is too small to
|
|
66
|
+
contradict anything.
|
|
67
|
+
- canonical: gray
|
|
68
|
+
variant: grey
|
|
69
|
+
confidence: low-count
|
|
70
|
+
note: >-
|
|
71
|
+
68/32 in src/ on n=25. Direction is consistent across directories but the
|
|
72
|
+
total is small; recorded as decided and flagged as thin evidence.
|
|
73
|
+
- canonical: canonicalize
|
|
74
|
+
variant: canonicalise
|
|
75
|
+
confidence: low-count
|
|
76
|
+
note: 100/0 in src/ on n=2. Follows `organize` rather than standing on its own count.
|
|
77
|
+
|
|
78
|
+
# --- decided AGAINST the published aggregate, on the shipped-surface reading ---
|
|
79
|
+
- canonical: behavior
|
|
80
|
+
variant: behaviour
|
|
81
|
+
confidence: decided-against-aggregate
|
|
82
|
+
note: >-
|
|
83
|
+
The pair the roadmap called hard. src/ is 22/78 American, so on the
|
|
84
|
+
shipped surface the majority rule and the consistency rule agree. The
|
|
85
|
+
aggregate's 57/43 British lead is an artifact of counting agents/.
|
|
86
|
+
- canonical: artifact
|
|
87
|
+
variant: artefact
|
|
88
|
+
confidence: decided-against-aggregate
|
|
89
|
+
note: >-
|
|
90
|
+
Aggregate 51/49 is a coin-flip and agents/ is 49/51, but src/ is 63/37.
|
|
91
|
+
Decided on the shipped surface for the same reason as `behavior`.
|
|
92
|
+
|
|
93
|
+
# --- decided, but the migration is explicitly NOT mechanical ---
|
|
94
|
+
- canonical: license
|
|
95
|
+
variant: licence
|
|
96
|
+
confidence: semantic-care-required
|
|
97
|
+
note: >-
|
|
98
|
+
94/6 in src/. `license` is both noun and verb in the canonical dialect, so
|
|
99
|
+
no noun/verb distinction is preserved in repository-authored prose. But
|
|
100
|
+
exact licence TITLES and quoted names are protected text and are never
|
|
101
|
+
rewritten -- and per the council, proximity to a protected name does not
|
|
102
|
+
exempt the surrounding prose. This pair is the one where a mechanical
|
|
103
|
+
find-and-replace would be wrong.
|
|
104
|
+
|
|
105
|
+
# --- NOT decided ---
|
|
106
|
+
- canonical: null
|
|
107
|
+
variant: pre-flight
|
|
108
|
+
also: preflight
|
|
109
|
+
confidence: undecided
|
|
110
|
+
note: >-
|
|
111
|
+
The one pair this file declines to decide. src/ is 44/56 in favour of the
|
|
112
|
+
HYPHENATED form on n=25, while the aggregate says 68/32 for the closed
|
|
113
|
+
form. The honest reading of a 25-sample near-tie is undecided, not decided
|
|
114
|
+
the other way, and picking a side to make the table look complete is the
|
|
115
|
+
failure this entry exists to avoid. Revisit when src/ carries enough
|
|
116
|
+
occurrences to separate the two.
|
|
117
|
+
|
|
118
|
+
# `cancelled` / `canceled` is 946/0 and needs no entry -- recorded in the
|
|
119
|
+
# wording baseline so a later pass does not spend a sweep on it.
|