@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
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Read-only query: which roadmap stubs are overdue for a read, and which
|
|
4
|
+
* decisions are sitting on the owner.
|
|
5
|
+
*
|
|
6
|
+
* WHY THIS EXISTS, AND WHY IT LANDS BEFORE THE DATES DO.
|
|
7
|
+
* `agents/roadmaps/stubs/` holds 77 files that are, by construction, not active
|
|
8
|
+
* work — the directory listing IS the inventory (the index tables were deleted
|
|
9
|
+
* on 2026-08-21 and `check_no_stub_inventory_table` keeps them deleted). Giving
|
|
10
|
+
* each stub a `review_by:` date without giving anyone a way to READ those dates
|
|
11
|
+
* would be strictly worse than adding nothing: the repository would carry a
|
|
12
|
+
* field certifying attention it does not pay, and a stale date reads as
|
|
13
|
+
* evidence. An AI council (2026-08-26, 2/2) made the ordering a rule — the
|
|
14
|
+
* reader lands first, the backfill second. This is the reader.
|
|
15
|
+
*
|
|
16
|
+
* WHAT IT IS NOT. It is not a gate: it always exits 0, because "three stubs are
|
|
17
|
+
* overdue" is a state of the world, not a defect in a diff. It is not an
|
|
18
|
+
* inventory table: it prints to stdout on demand and writes nothing, least of
|
|
19
|
+
* all into `agents/roadmaps/stubs/`, so the guard that deleted the tables stays
|
|
20
|
+
* green and un-weakened. `agent-config roadmap:progress` consumes only its two
|
|
21
|
+
* COUNTS for the dashboard header — two integers, no rows, nothing to grow an
|
|
22
|
+
* index back from.
|
|
23
|
+
*
|
|
24
|
+
* THE TWO SHAPES HAVE DIFFERENT CLOCKS, and the cadence follows the shape, not
|
|
25
|
+
* the file. A drain-run transfer is capability-gated: an environment can appear
|
|
26
|
+
* at any moment, so it is re-probed every 30 days. An org-mode stub is
|
|
27
|
+
* demand-gated: customer recruitment and audit funding move slowly, so its
|
|
28
|
+
* demand question is re-asked every 120 days. Both numbers, and the reason 120
|
|
29
|
+
* was taken over 180, are recorded in `agents/roadmaps/stubs/README.md`
|
|
30
|
+
* § Frontmatter contract.
|
|
31
|
+
*
|
|
32
|
+
* OWNER DECISIONS are counted from two deterministic markers, because "the text
|
|
33
|
+
* routes a decision to the owner" needs to be readable by a script and not only
|
|
34
|
+
* by a person: an `## Unresolved decision` heading, and an open `### blocker:`
|
|
35
|
+
* whose owner is the maintainer. A stub can carry both.
|
|
36
|
+
*
|
|
37
|
+
* CLI contract: always exit 0.
|
|
38
|
+
* ./scripts-run src/scripts/stubs_due
|
|
39
|
+
* ./scripts-run src/scripts/stubs_due --json
|
|
40
|
+
* ./scripts-run src/scripts/stubs_due --counts # the two integers only
|
|
41
|
+
* ./scripts-run src/scripts/stubs_due --today 2026-12-01 # pin "now"
|
|
42
|
+
*/
|
|
43
|
+
import * as fs from 'node:fs';
|
|
44
|
+
import * as path from 'node:path';
|
|
45
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
46
|
+
|
|
47
|
+
const STUB_DIR = path.join('agents', 'roadmaps', 'stubs');
|
|
48
|
+
|
|
49
|
+
/** Cadence in days, per stub shape. Source of truth: the README section above. */
|
|
50
|
+
export const CADENCE_DAYS = { transfer: 30, orgmode: 120 } as const;
|
|
51
|
+
|
|
52
|
+
/** The marker that identifies a drain-run transfer in a stub body. */
|
|
53
|
+
const TRANSFER_MARKER = 'drain-run transfer';
|
|
54
|
+
|
|
55
|
+
const _HERE = path.resolve(fileURLToPath(import.meta.url));
|
|
56
|
+
|
|
57
|
+
export type StubShape = 'transfer' | 'orgmode';
|
|
58
|
+
|
|
59
|
+
export interface StubRecord {
|
|
60
|
+
file: string;
|
|
61
|
+
shape: StubShape;
|
|
62
|
+
review_by: string | null;
|
|
63
|
+
reviewed_at: string | null;
|
|
64
|
+
probe_none: boolean;
|
|
65
|
+
has_probe_heading: boolean;
|
|
66
|
+
owner_decisions: number;
|
|
67
|
+
overdue: boolean;
|
|
68
|
+
days_overdue: number | null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function _isDir(p: string): boolean {
|
|
72
|
+
try {
|
|
73
|
+
return fs.statSync(p).isDirectory();
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Walk up from CWD until a dir containing `agents/roadmaps/stubs` is found. */
|
|
80
|
+
export function repo_root(start?: string): string {
|
|
81
|
+
let cur = start ?? process.cwd();
|
|
82
|
+
const chain = [cur];
|
|
83
|
+
for (;;) {
|
|
84
|
+
const parent = path.dirname(cur);
|
|
85
|
+
if (parent === cur) break;
|
|
86
|
+
chain.push(parent);
|
|
87
|
+
cur = parent;
|
|
88
|
+
}
|
|
89
|
+
for (const candidate of chain) {
|
|
90
|
+
if (_isDir(path.join(candidate, STUB_DIR))) {
|
|
91
|
+
return candidate;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return start ?? process.cwd();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The frontmatter block, as raw lines. Returns [] when the file does not open
|
|
99
|
+
* with `---` — a stub without frontmatter simply has no fields, which the
|
|
100
|
+
* caller reports rather than crashing on.
|
|
101
|
+
*/
|
|
102
|
+
function _frontmatter(text: string): string[] {
|
|
103
|
+
const lines = text.split('\n');
|
|
104
|
+
if (lines[0]?.trim() !== '---') {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
const out: string[] = [];
|
|
108
|
+
for (const line of lines.slice(1)) {
|
|
109
|
+
if (line.trim() === '---') {
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
112
|
+
out.push(line);
|
|
113
|
+
}
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function _scalar(front: string[], key: string): string | null {
|
|
118
|
+
const prefix = `${key}:`;
|
|
119
|
+
for (const line of front) {
|
|
120
|
+
if (line.startsWith(prefix)) {
|
|
121
|
+
return line.slice(prefix.length).trim().replace(/^["']|["']$/g, '');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Owner-routed decisions in one stub body. Two markers, unioned:
|
|
129
|
+
* - an `## Unresolved decision …` heading — the shape
|
|
130
|
+
* `road-to-owner-authority-decisions.md` already uses;
|
|
131
|
+
* - an open `### blocker:` whose Owner line names the maintainer.
|
|
132
|
+
* Counting the union rather than one of them is deliberate: a stub can carry
|
|
133
|
+
* both, and either alone would under-report.
|
|
134
|
+
*/
|
|
135
|
+
export function count_owner_decisions(text: string): number {
|
|
136
|
+
const lines = text.split('\n');
|
|
137
|
+
let n = 0;
|
|
138
|
+
for (const line of lines) {
|
|
139
|
+
if (/^#{2,4}\s+Unresolved decision\b/.test(line)) {
|
|
140
|
+
n += 1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Open maintainer-owned blockers. Scan each `### blocker:` section for the
|
|
144
|
+
// two field lines; a blocker missing either is not counted, because an
|
|
145
|
+
// unstated owner is not an owner decision.
|
|
146
|
+
let inBlocker = false;
|
|
147
|
+
let ownerIsMaintainer = false;
|
|
148
|
+
let statusOpen = false;
|
|
149
|
+
const flush = (): void => {
|
|
150
|
+
if (inBlocker && ownerIsMaintainer && statusOpen) {
|
|
151
|
+
n += 1;
|
|
152
|
+
}
|
|
153
|
+
inBlocker = false;
|
|
154
|
+
ownerIsMaintainer = false;
|
|
155
|
+
statusOpen = false;
|
|
156
|
+
};
|
|
157
|
+
for (const line of lines) {
|
|
158
|
+
if (/^#{2,4}\s+(blocker:|b-)/.test(line.trim()) || /^#{2,4}\s+\S+ — /.test(line)) {
|
|
159
|
+
if (/blocker:/.test(line) || /^#{2,4}\s+b-/.test(line.trim())) {
|
|
160
|
+
flush();
|
|
161
|
+
inBlocker = true;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (!inBlocker) continue;
|
|
166
|
+
if (/^#{1,4}\s/.test(line)) {
|
|
167
|
+
flush();
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (/^-\s+\*\*Owner:\*\*\s*maintainer\b/i.test(line)) ownerIsMaintainer = true;
|
|
171
|
+
if (/^-\s+\*\*Status:\*\*\s*open\b/i.test(line)) statusOpen = true;
|
|
172
|
+
}
|
|
173
|
+
flush();
|
|
174
|
+
return n;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/** ISO date (UTC) N days after `from`. */
|
|
178
|
+
function _addDays(from: Date, days: number): string {
|
|
179
|
+
const d = new Date(from.getTime() + days * 86_400_000);
|
|
180
|
+
return d.toISOString().slice(0, 10);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function _parseIso(s: string): Date | null {
|
|
184
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(s)) return null;
|
|
185
|
+
const d = new Date(`${s}T00:00:00Z`);
|
|
186
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Read every stub and classify it. `today` is injectable so tests are stable. */
|
|
190
|
+
export function scan(root: string, today: string): StubRecord[] {
|
|
191
|
+
return scan_dir(path.join(root, STUB_DIR), today);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Same, but addressed by the stub DIRECTORY rather than the repo root.
|
|
196
|
+
* `update_roadmap_progress` already holds `agents/roadmaps` and would otherwise
|
|
197
|
+
* have to walk back up two levels to hand this function a root it would
|
|
198
|
+
* immediately re-join — a fragile round trip past exactly the directory both
|
|
199
|
+
* callers care about.
|
|
200
|
+
*/
|
|
201
|
+
export function scan_dir(base: string, today: string): StubRecord[] {
|
|
202
|
+
if (!_isDir(base)) return [];
|
|
203
|
+
const now = _parseIso(today);
|
|
204
|
+
const out: StubRecord[] = [];
|
|
205
|
+
let names: string[];
|
|
206
|
+
try {
|
|
207
|
+
names = fs
|
|
208
|
+
.readdirSync(base)
|
|
209
|
+
.filter((n) => n.endsWith('.md') && n !== 'README.md')
|
|
210
|
+
.sort();
|
|
211
|
+
} catch {
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
for (const name of names) {
|
|
215
|
+
let text: string;
|
|
216
|
+
try {
|
|
217
|
+
text = fs.readFileSync(path.join(base, name), 'utf8');
|
|
218
|
+
} catch {
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const front = _frontmatter(text);
|
|
222
|
+
const review_by = _scalar(front, 'review_by');
|
|
223
|
+
const reviewed_at = _scalar(front, 'reviewed_at');
|
|
224
|
+
const probeVal = _scalar(front, 'probe');
|
|
225
|
+
const shape: StubShape = text.includes(TRANSFER_MARKER) ? 'transfer' : 'orgmode';
|
|
226
|
+
let overdue = false;
|
|
227
|
+
let days_overdue: number | null = null;
|
|
228
|
+
if (review_by !== null && now !== null) {
|
|
229
|
+
const due = _parseIso(review_by);
|
|
230
|
+
if (due !== null && due.getTime() < now.getTime()) {
|
|
231
|
+
overdue = true;
|
|
232
|
+
days_overdue = Math.round((now.getTime() - due.getTime()) / 86_400_000);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
out.push({
|
|
236
|
+
file: `${STUB_DIR}/${name}`,
|
|
237
|
+
shape,
|
|
238
|
+
review_by,
|
|
239
|
+
reviewed_at,
|
|
240
|
+
probe_none: probeVal === 'none',
|
|
241
|
+
has_probe_heading: /^#{1,4} *(Probe|Promotion)/m.test(text),
|
|
242
|
+
owner_decisions: count_owner_decisions(text),
|
|
243
|
+
overdue,
|
|
244
|
+
days_overdue,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return out;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export interface Counts {
|
|
251
|
+
overdue: number;
|
|
252
|
+
owner_decisions: number;
|
|
253
|
+
missing_review_by: number;
|
|
254
|
+
total: number;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function counts(records: StubRecord[]): Counts {
|
|
258
|
+
return {
|
|
259
|
+
overdue: records.filter((r) => r.overdue).length,
|
|
260
|
+
owner_decisions: records.reduce((s, r) => s + r.owner_decisions, 0),
|
|
261
|
+
missing_review_by: records.filter((r) => r.review_by === null).length,
|
|
262
|
+
total: records.length,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** Suggested `review_by:` for a stub of this shape, dated from `from`. */
|
|
267
|
+
export function due_date(shape: StubShape, from: string): string {
|
|
268
|
+
const d = _parseIso(from) ?? new Date();
|
|
269
|
+
return _addDays(d, CADENCE_DAYS[shape]);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
273
|
+
const asJson = argv.includes('--json');
|
|
274
|
+
const countsOnly = argv.includes('--counts');
|
|
275
|
+
const todayIdx = argv.indexOf('--today');
|
|
276
|
+
const today =
|
|
277
|
+
todayIdx >= 0 && argv[todayIdx + 1] !== undefined
|
|
278
|
+
? (argv[todayIdx + 1] as string)
|
|
279
|
+
: new Date().toISOString().slice(0, 10);
|
|
280
|
+
|
|
281
|
+
const root = repo_root();
|
|
282
|
+
const records = scan(root, today);
|
|
283
|
+
const c = counts(records);
|
|
284
|
+
|
|
285
|
+
if (countsOnly) {
|
|
286
|
+
process.stdout.write(`${c.overdue} ${c.owner_decisions}\n`);
|
|
287
|
+
return 0;
|
|
288
|
+
}
|
|
289
|
+
if (asJson) {
|
|
290
|
+
process.stdout.write(`${JSON.stringify({ today, counts: c, stubs: records }, null, 2)}\n`);
|
|
291
|
+
return 0;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
process.stdout.write(`stubs:due · ${today} · ${c.total} stub(s) under ${STUB_DIR}/\n\n`);
|
|
295
|
+
|
|
296
|
+
const overdue = records.filter((r) => r.overdue).sort((a, b) => (b.days_overdue ?? 0) - (a.days_overdue ?? 0));
|
|
297
|
+
if (overdue.length === 0) {
|
|
298
|
+
process.stdout.write(' ✅ no stub is past its review date.\n');
|
|
299
|
+
} else {
|
|
300
|
+
process.stdout.write(` ⚠️ ${overdue.length} overdue:\n`);
|
|
301
|
+
for (const r of overdue) {
|
|
302
|
+
process.stdout.write(
|
|
303
|
+
` ${r.file} (${r.shape}, due ${r.review_by}, ${r.days_overdue}d late)\n`,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (c.missing_review_by > 0) {
|
|
309
|
+
process.stdout.write(
|
|
310
|
+
`\n ⚠️ ${c.missing_review_by} stub(s) carry no \`review_by:\` — see ` +
|
|
311
|
+
`${STUB_DIR}/README.md § Frontmatter contract:\n`,
|
|
312
|
+
);
|
|
313
|
+
for (const r of records.filter((x) => x.review_by === null)) {
|
|
314
|
+
process.stdout.write(
|
|
315
|
+
` ${r.file} (${r.shape}, suggested ${due_date(r.shape, today)})\n`,
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const withDecisions = records.filter((r) => r.owner_decisions > 0);
|
|
321
|
+
process.stdout.write(`\n ${c.owner_decisions} decision(s) routed to the owner`);
|
|
322
|
+
if (withDecisions.length === 0) {
|
|
323
|
+
process.stdout.write('.\n');
|
|
324
|
+
} else {
|
|
325
|
+
process.stdout.write(':\n');
|
|
326
|
+
for (const r of withDecisions) {
|
|
327
|
+
process.stdout.write(` ${r.file} (${r.owner_decisions})\n`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const noProbe = records.filter((r) => !r.probe_none && !r.has_probe_heading);
|
|
332
|
+
if (noProbe.length > 0) {
|
|
333
|
+
process.stdout.write(
|
|
334
|
+
`\n ⚠️ ${noProbe.length} stub(s) name no promoting probe and do not say ` +
|
|
335
|
+
'`probe: none`:\n',
|
|
336
|
+
);
|
|
337
|
+
for (const r of noProbe) {
|
|
338
|
+
process.stdout.write(` ${r.file}\n`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
process.stdout.write('\n Read-only. This command writes nothing.\n');
|
|
343
|
+
return 0;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function _isCliEntry(): boolean {
|
|
347
|
+
if (process.argv[1] === undefined) {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
351
|
+
if (import.meta.url === argvUrl) {
|
|
352
|
+
return true;
|
|
353
|
+
}
|
|
354
|
+
try {
|
|
355
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
356
|
+
const argv = fs.realpathSync(path.resolve(process.argv[1]));
|
|
357
|
+
return here === argv;
|
|
358
|
+
} catch {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
364
|
+
process.exitCode = main();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* The dashboard header fragment: two integers and a pointer, or `''` when both
|
|
369
|
+
* are zero.
|
|
370
|
+
*
|
|
371
|
+
* Lives here rather than in `update_roadmap_progress` deliberately. That file
|
|
372
|
+
* sits on the wrong side of the 1,500-line source-size ratchet, so every line
|
|
373
|
+
* added to it is charged; this one is 365 lines and is charged nothing. The
|
|
374
|
+
* generator gets a one-line call, and the rule that a count is not an inventory
|
|
375
|
+
* — no row, no per-stub link, nothing for the deleted index tables to grow back
|
|
376
|
+
* from — is enforced in one place instead of two.
|
|
377
|
+
*
|
|
378
|
+
* Failure-tolerant by construction: a tree with no `agents/roadmaps/stubs/`
|
|
379
|
+
* yields `''` rather than throwing. This runs in consumer installs that carry no
|
|
380
|
+
* stub directory at all, so a throwing read here would break their dashboard.
|
|
381
|
+
*/
|
|
382
|
+
export function headerFragment(stubsDir: string, today?: string): string {
|
|
383
|
+
let overdue = 0;
|
|
384
|
+
let decisions = 0;
|
|
385
|
+
try {
|
|
386
|
+
const c = counts(scan_dir(stubsDir, today ?? new Date().toISOString().slice(0, 10)));
|
|
387
|
+
overdue = c.overdue;
|
|
388
|
+
decisions = c.owner_decisions;
|
|
389
|
+
} catch {
|
|
390
|
+
return '';
|
|
391
|
+
}
|
|
392
|
+
if (overdue === 0 && decisions === 0) {
|
|
393
|
+
return '';
|
|
394
|
+
}
|
|
395
|
+
return (
|
|
396
|
+
` · **${overdue}** overdue stub${overdue !== 1 ? 's' : ''}` +
|
|
397
|
+
`, **${decisions}** owner decision${decisions !== 1 ? 's' : ''}` +
|
|
398
|
+
' → `agent-config stubs:due`'
|
|
399
|
+
);
|
|
400
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ticket bundles, read from `agents/tickets/_registry.yml` for the dashboard.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `update_roadmap_progress.ts` and imported back, so behaviour is
|
|
5
|
+
* unchanged. The move is mechanical: that file sits above the 1500-line ceiling
|
|
6
|
+
* `check_source_size_budget` charges, and a run that adds lines there pays for
|
|
7
|
+
* them by extraction rather than by raising a baseline.
|
|
8
|
+
*/
|
|
9
|
+
import { createRequire } from 'node:module';
|
|
10
|
+
import * as fs from 'node:fs';
|
|
11
|
+
import * as path from 'node:path';
|
|
12
|
+
|
|
13
|
+
import type * as YamlModule from 'yaml';
|
|
14
|
+
|
|
15
|
+
const _require = createRequire(import.meta.url);
|
|
16
|
+
|
|
17
|
+
/** Local copy: the parent keeps its own, and one tiny predicate is cheaper than
|
|
18
|
+
* an export cycle between two scripts in the same directory. */
|
|
19
|
+
function _isDir(p: string): boolean {
|
|
20
|
+
try {
|
|
21
|
+
return fs.statSync(p).isDirectory();
|
|
22
|
+
} catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface Bundle {
|
|
28
|
+
slug: string;
|
|
29
|
+
tickets: number;
|
|
30
|
+
status: string;
|
|
31
|
+
roadmap: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function collect_bundles(repo_root: string): Bundle[] {
|
|
35
|
+
const reg = path.join(repo_root, 'agents', 'tickets', '_registry.yml');
|
|
36
|
+
if (!fs.existsSync(reg)) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
let YAML: typeof YamlModule;
|
|
40
|
+
try {
|
|
41
|
+
YAML = _require('yaml') as typeof YamlModule;
|
|
42
|
+
} catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
let data: unknown;
|
|
46
|
+
try {
|
|
47
|
+
// yaml.safe_load(...) or {} — PyYAML 1.1 semantics; graceful on malformed.
|
|
48
|
+
data = YAML.parse(fs.readFileSync(reg, { encoding: 'utf-8' }), { version: '1.1' }) ?? {};
|
|
49
|
+
} catch {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const out: Bundle[] = [];
|
|
53
|
+
const bundles =
|
|
54
|
+
data && typeof data === 'object' && !Array.isArray(data)
|
|
55
|
+
? ((data as Record<string, unknown>)['bundles'] ?? null)
|
|
56
|
+
: null;
|
|
57
|
+
const bundleMap =
|
|
58
|
+
bundles && typeof bundles === 'object' && !Array.isArray(bundles)
|
|
59
|
+
? (bundles as Record<string, unknown>)
|
|
60
|
+
: {};
|
|
61
|
+
for (const slug of Object.keys(bundleMap).sort()) {
|
|
62
|
+
const metaRaw = bundleMap[slug];
|
|
63
|
+
const meta =
|
|
64
|
+
metaRaw && typeof metaRaw === 'object' && !Array.isArray(metaRaw)
|
|
65
|
+
? (metaRaw as Record<string, unknown>)
|
|
66
|
+
: {};
|
|
67
|
+
const bdir = path.join(repo_root, 'agents', 'tickets', slug);
|
|
68
|
+
let n = 0;
|
|
69
|
+
if (_isDir(bdir)) {
|
|
70
|
+
try {
|
|
71
|
+
n = fs.readdirSync(bdir).filter((f) => f.startsWith('T-') && f.endsWith('.md')).length;
|
|
72
|
+
} catch {
|
|
73
|
+
n = 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
out.push({
|
|
77
|
+
slug,
|
|
78
|
+
tickets: n,
|
|
79
|
+
status: (meta['status'] as string) ?? '?',
|
|
80
|
+
roadmap: (meta['source_roadmap'] as string) ?? '',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
@@ -71,6 +71,8 @@ import {
|
|
|
71
71
|
type DashboardMode,
|
|
72
72
|
} from './dashboard_mode.js';
|
|
73
73
|
import type * as YamlModule from 'yaml';
|
|
74
|
+
import { headerFragment as stubHeaderFragment } from './stubs_due.js';
|
|
75
|
+
import { reportGuardedBaselines } from './guarded_baseline.js'; // third step state; contract lives there
|
|
74
76
|
|
|
75
77
|
const _HERE = fileURLToPath(import.meta.url);
|
|
76
78
|
const _require = createRequire(import.meta.url);
|
|
@@ -995,6 +997,8 @@ function render(roadmaps: RoadmapStats[], bundles: Bundle[] | null, roadmap_root
|
|
|
995
997
|
? `, **${user_open_blockers}** need you → \`agent-config gates\``
|
|
996
998
|
: '')
|
|
997
999
|
: '') +
|
|
1000
|
+
// Two integers, never a row — see `stubs_due.headerFragment`.
|
|
1001
|
+
stubHeaderFragment(path.join(roadmap_root, 'stubs')) +
|
|
998
1002
|
'\n';
|
|
999
1003
|
lines.push(
|
|
1000
1004
|
// Honest provenance (road-to-roadmap-archival-robustness, gap C): name a
|
|
@@ -1362,8 +1366,8 @@ function main(argv?: readonly string[]): number {
|
|
|
1362
1366
|
return 1;
|
|
1363
1367
|
}
|
|
1364
1368
|
}
|
|
1365
|
-
const roadmaps = collect(roadmap_root);
|
|
1366
|
-
const new_text = render(roadmaps, collect_bundles(repo_root), roadmap_root);
|
|
1369
|
+
const roadmaps = collect(roadmap_root), guarded = reportGuardedBaselines(roadmaps, repo_root);
|
|
1370
|
+
const new_text = render(roadmaps, collect_bundles(repo_root), roadmap_root) + guarded.section;
|
|
1367
1371
|
const complete = unarchived_complete(roadmaps);
|
|
1368
1372
|
const pending = pending_iron_law_3(roadmaps);
|
|
1369
1373
|
const gated = merge_gated_pending(roadmaps);
|
|
@@ -1395,7 +1399,7 @@ function main(argv?: readonly string[]): number {
|
|
|
1395
1399
|
});
|
|
1396
1400
|
if (r.stderr) process.stderr.write(r.stderr);
|
|
1397
1401
|
if (r.stdout) process.stdout.write(r.stdout);
|
|
1398
|
-
return r.rc;
|
|
1402
|
+
return guarded.problems > 0 ? 1 : r.rc;
|
|
1399
1403
|
}
|
|
1400
1404
|
fs.writeFileSync(target, new_text, { encoding: 'utf-8' });
|
|
1401
1405
|
process.stdout.write(
|
|
@@ -1431,7 +1435,7 @@ function main(argv?: readonly string[]): number {
|
|
|
1431
1435
|
if (gated.length) {
|
|
1432
1436
|
_warn_merge_gated();
|
|
1433
1437
|
}
|
|
1434
|
-
return 0;
|
|
1438
|
+
return guarded.problems > 0 ? 1 : 0;
|
|
1435
1439
|
}
|
|
1436
1440
|
|
|
1437
1441
|
function _isCliEntry(): boolean {
|
|
@@ -28,16 +28,29 @@ adapters — not a second image-gen stack.
|
|
|
28
28
|
|
|
29
29
|
## When to use
|
|
30
30
|
|
|
31
|
-
- User asks to generate a banner, social card, header image,
|
|
31
|
+
- User asks to generate a banner, social card, header image, **platform profile
|
|
32
|
+
or cover image** (a LinkedIn cover, an X header, a YouTube channel art), or a
|
|
33
|
+
CIP (corporate identity) element.
|
|
32
34
|
- Branded asset production where palette, typography, or voice must stay consistent.
|
|
33
35
|
- When brand tokens are available and should drive the visual output.
|
|
34
36
|
- When a brief alone (no tokens) still needs a governance-aware image output.
|
|
35
37
|
|
|
36
38
|
## Procedure
|
|
37
39
|
|
|
38
|
-
1. **Identify asset type and spec** — determine format (banner, social card,
|
|
39
|
-
output dimensions (e.g. 1200×630
|
|
40
|
-
and target channel (web, print,
|
|
40
|
+
1. **Identify asset type and spec** — determine format (banner, social card,
|
|
41
|
+
platform profile/cover image, CIP element), output dimensions (e.g. 1200×630
|
|
42
|
+
for Open Graph, 1080×1080 for square social), and target channel (web, print,
|
|
43
|
+
social platform).
|
|
44
|
+
|
|
45
|
+
**A platform cover is a dimension constraint, not a new asset class**, and it
|
|
46
|
+
is the one case where guessing the number is the whole failure: a cover
|
|
47
|
+
rendered at the wrong aspect ratio is cropped by the platform, so the brand
|
|
48
|
+
marks land outside the visible area and the asset is unusable rather than
|
|
49
|
+
merely off-brand. Take the required dimensions from the platform's own
|
|
50
|
+
current spec at generation time — never from memory, and never from a number
|
|
51
|
+
written here, because these change without notice. If the spec cannot be
|
|
52
|
+
established, say so and ask rather than emitting an asset that will be
|
|
53
|
+
cropped.
|
|
41
54
|
2. **Inject brand tokens when present** — if `pack-brand` is installed, load `.tokens.json`
|
|
42
55
|
(colors, typography, voice). Feed hex values, font names, and tone keywords directly
|
|
43
56
|
into the prompt. Without tokens, derive palette and type from the brief itself;
|
|
@@ -35,6 +35,23 @@ Method skill. Inventories current brand expression across touchpoints and flags
|
|
|
35
35
|
|
|
36
36
|
1. **Gather the source of truth.** Collect the consumer brand's defined tokens (palette, type scale, logo rules), voice profile, and strategy doc if they exist. Consumer brand definition is authoritative; corpus defaults are gap-fill only.
|
|
37
37
|
2. **Inventory current expression per touchpoint.** Cover logo usage, colour palette, typography, voice/copy tone, imagery style, and iconography across the relevant surfaces (site, app, decks, marketing, docs).
|
|
38
|
+
|
|
39
|
+
**Personal and company profile surfaces, including LinkedIn, X, and GitHub
|
|
40
|
+
organization profiles, are deliberately excluded regardless of whether their
|
|
41
|
+
content is fetched, pasted, or supplied as a file, pending a written
|
|
42
|
+
public-profile-field privacy floor defining what may be processed.**
|
|
43
|
+
|
|
44
|
+
Recorded so the next reader does not re-derive the gap, which has already
|
|
45
|
+
happened once. The exclusion is about **handling**, not retrieval: a pasted
|
|
46
|
+
profile is mechanically a different thing from a network fetch, but the
|
|
47
|
+
missing artefact is a field-level classification saying which profile fields
|
|
48
|
+
are brand surface (logo, palette, bio messaging) and which are PII-adjacent
|
|
49
|
+
(employment history, contributor names, location). A profile's About text
|
|
50
|
+
carries both in one field. Without that classification the skill cannot
|
|
51
|
+
distinguish them, and no test can assert that it did. AI council 2/2,
|
|
52
|
+
2026-08-25. Include user-supplied profile inputs once a written, testable
|
|
53
|
+
field-level privacy floor exists; include fetched inputs only after both that
|
|
54
|
+
floor and a host-agent fetch contract exist.
|
|
38
55
|
3. **UI surface.** Invoke `existing-ui-audit` for UI component inventory. Do not re-implement it here — take its output as an input to this audit.
|
|
39
56
|
4. **Compare observed vs. defined.** For each touchpoint value, check it against the matching token or voice rule.
|
|
40
57
|
5. **Classify each finding.** Three buckets: `on-brand` (matches the defined token), `drift` (observed value diverges from the token), `undefined` (no token exists to audit against — this is a governance gap, not automatically wrong).
|
|
@@ -42,6 +59,22 @@ Method skill. Inventories current brand expression across touchpoints and flags
|
|
|
42
59
|
7. **Verify completeness.** Confirm every inventoried touchpoint is classified (`on-brand` / `drift` / `undefined`) — the audit is complete only when the classified count equals the inventoried count, and `existing-ui-audit` has run for every in-scope UI surface. Ensure each drift finding cites BOTH the defined value and the observed value; a finding missing either side is not yet verified.
|
|
43
60
|
8. **Output the findings list** (see Output format). Do not redesign or author replacements — hand drift findings to `brand-identity` or `brand-strategy`.
|
|
44
61
|
|
|
62
|
+
## Two constraints on platform-specific guidance
|
|
63
|
+
|
|
64
|
+
Both are constraints on what this skill may assert, not machinery, and neither
|
|
65
|
+
is a registry.
|
|
66
|
+
|
|
67
|
+
- **Any platform-specific guidance carries a source tier and a review date.**
|
|
68
|
+
Platform conventions — an image aspect ratio, a character limit, where a
|
|
69
|
+
profile crops a banner — change without notice, so a number stated here
|
|
70
|
+
without a date and a source is a claim that quietly stops being true. Tier it
|
|
71
|
+
(`platform-doc` / `observed` / `inferred`) and date it, or take it from the
|
|
72
|
+
platform's own current spec at audit time instead of stating it.
|
|
73
|
+
- **No engagement metric is stated as fact.** Reach, impression and
|
|
74
|
+
best-time-to-post figures are platform- and account-specific and are not
|
|
75
|
+
auditable from a brand token. Where such a figure is load-bearing to a
|
|
76
|
+
finding, attribute it; never assert it as a general truth.
|
|
77
|
+
|
|
45
78
|
## Output format
|
|
46
79
|
|
|
47
80
|
1. **Source-of-truth summary** — what brand tokens, voice rules, and strategy exist and where they were found (or "none defined" if absent).
|
|
@@ -77,6 +77,63 @@ Every answer built with this skill MUST:
|
|
|
77
77
|
That is the engine being honest, not broken — do not "resolve" them yourself
|
|
78
78
|
by guessing.
|
|
79
79
|
|
|
80
|
+
## Measured twice, and it has not won (v2, 2026-08-29)
|
|
81
|
+
|
|
82
|
+
Pre-registered, published whichever way it landed:
|
|
83
|
+
`internal/bench/reports/code-graph-vs-grep-inrepo-v2-2026-08-29.md`. The native
|
|
84
|
+
engine scored against disciplined `git grep` over three in-repo TypeScript
|
|
85
|
+
roots, 19 questions, per-class bars fixed before the run and unchanged from v1.
|
|
86
|
+
|
|
87
|
+
| Class | grep R | graph R | Δ pp | grep P | graph P | verdict |
|
|
88
|
+
|---|---|---|---|---|---|---|
|
|
89
|
+
| `callers` | 1.000 | 1.000 | +0.0 | 0.611 | 0.667 | TIE |
|
|
90
|
+
| `transitive-impact` | 0.611 | 0.500 | −11.1 | 1.000 | 0.667 | NULL |
|
|
91
|
+
| `path-between` | 0.917 | **1.000** | +8.3 | 0.778 | **1.000** | TIE |
|
|
92
|
+
| `references` | 1.000 | 0.333 | −66.7 | 0.833 | 0.333 | NULL |
|
|
93
|
+
|
|
94
|
+
**Zero classes met the win bar.** On `path-between` the graph is exact and is the
|
|
95
|
+
only class where it out-precises grep; it still ties, because the delta is +8.3 pp
|
|
96
|
+
against a +10 pp bar that was fixed before the run.
|
|
97
|
+
|
|
98
|
+
**The v1 run of 2026-08-28 published a false root cause, corrected 2026-08-29.**
|
|
99
|
+
It reported `path-between` as `VOID` because *"both arms measured nothing"*. Only
|
|
100
|
+
the grep arm did. The graph answered all three questions and v1's scorer discarded
|
|
101
|
+
the answer — it compared each returned symbol against the whole probe string
|
|
102
|
+
`"cmdBuild -> getParser"`. v1 also never invoked the shipped `path <a> <b>` verb,
|
|
103
|
+
and counted unresolved `symbol:` pseudo-nodes as files, which is the sole reason
|
|
104
|
+
its `callers` verdict was NULL with recall tied. v1's numbers are not retro-edited
|
|
105
|
+
— they were faithful to v1's own registration — and v1's report now carries the
|
|
106
|
+
correction. Do not quote a `path-between` delta near +89 pp: that figure comes
|
|
107
|
+
from repairing the graph arm and leaving grep on the broken probe.
|
|
108
|
+
|
|
109
|
+
**The rule's own wording was corrected by this result.** `external-code-graph-interop`
|
|
110
|
+
used to open by saying a committed index answers "far more precisely than a fresh
|
|
111
|
+
`grep`". That was never measured, and when it was, it was false for the native
|
|
112
|
+
engine on this repository's own code. The rule now gives the reasons that survive
|
|
113
|
+
measurement — an index that exists is already built and structured, so it is the
|
|
114
|
+
cheap first question — and drops the precision claim its own benchmark refuted.
|
|
115
|
+
|
|
116
|
+
**No class is graph-first.** Query the index first because an index that already
|
|
117
|
+
exists is cheap to ask and its answer is structured — not because it answers
|
|
118
|
+
better. When it returns nothing, that is the common case, and grep remains the
|
|
119
|
+
arm to fall back to rather than a grudging afterthought.
|
|
120
|
+
|
|
121
|
+
The sentence that stood here — *"the arm that won every valid class on this
|
|
122
|
+
corpus"* — is withdrawn. It is the framing v1's own report forbids: that report
|
|
123
|
+
says the defensible statement is *"zero classes met the pre-registered win
|
|
124
|
+
criterion"*, **not** that grep proved superior. It was also false on its own
|
|
125
|
+
terms under v2: grep wins two classes, ties two, and is out-precised on both
|
|
126
|
+
ties.
|
|
127
|
+
|
|
128
|
+
Scope, stated so this table is not over-read: it measured the **native** engine
|
|
129
|
+
on **this repository's TypeScript**, with a corpus of 19 questions. It is not
|
|
130
|
+
comparable to the 2026-07-28 external-corpus run, it is not comparable to v1
|
|
131
|
+
either (corpus, arm-B verb set and scorer all moved), and it says nothing about a
|
|
132
|
+
consumer-shipped SCIP index. Literal-string probes are reported as a separate
|
|
133
|
+
`capability-boundary` class with no floor derived from them: a symbol index
|
|
134
|
+
cannot answer them at all, which is where grep stays necessary rather than a
|
|
135
|
+
defect in the engine.
|
|
136
|
+
|
|
80
137
|
## Do NOT
|
|
81
138
|
|
|
82
139
|
- Do NOT rebuild a **fresh** consumer-shipped index — query it (interop
|