@event4u/agent-config 7.5.0 → 8.0.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/.claude-plugin/marketplace.json +8 -1
- package/AGENTS.md +9 -9
- package/CHANGELOG.md +325 -0
- package/README.md +35 -5
- package/dist/agent-src/commands/analytics/prune.md +1 -1
- package/dist/agent-src/commands/analytics/show.md +1 -1
- package/dist/agent-src/commands/analyze/decision.md +2 -2
- package/dist/agent-src/commands/analyze/incident.md +2 -2
- package/dist/agent-src/commands/analyze/near-miss.md +2 -2
- package/dist/agent-src/commands/analyze/postmortem.md +2 -2
- package/dist/agent-src/commands/analyze/premortem.md +2 -2
- package/dist/agent-src/commands/cost-report.md +25 -0
- package/dist/agent-src/commands/evals/analyze.json +30 -0
- package/dist/agent-src/commands/evals/mission-upgrade.json +30 -0
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/knowledge/forget.md +1 -1
- package/dist/agent-src/commands/knowledge/ingest.md +1 -1
- package/dist/agent-src/commands/knowledge/list.md +1 -1
- package/dist/agent-src/commands/memory/load.md +12 -11
- package/dist/agent-src/commands/memory/promote.md +30 -0
- package/dist/agent-src/commands/memory/propose.md +16 -2
- package/dist/agent-src/commands/mission/upgrade.md +1 -1
- package/dist/agent-src/commands/module/explore.md +11 -7
- package/dist/agent-src/commands/optimize-project.md +243 -0
- package/dist/agent-src/commands/optimize.md +5 -0
- package/dist/agent-src/commands/pr/create.md +37 -8
- package/dist/agent-src/commands/prediction-pool.md +2 -2
- package/dist/agent-src/commands/profile/activate.md +3 -3
- package/dist/agent-src/commands/profile/deactivate.md +2 -2
- package/dist/agent-src/commands/profile/show.md +3 -3
- package/dist/agent-src/commands/research/deep.md +5 -0
- package/dist/agent-src/commands/research/report.md +2 -1
- package/dist/agent-src/commands/roadmap/create.md +88 -10
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +15 -2
- package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
- package/dist/agent-src/commands/roadmap/process-step.md +4 -0
- package/dist/agent-src/commands/roadmap.md +1 -1
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/sync-agent-settings.md +1 -1
- package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
- package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
- package/dist/agent-src/commands/team-knowledge.md +64 -0
- package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
- package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
- package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
- package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
- package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
- package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
- package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
- package/dist/agent-src/contexts/override-system.md +1 -1
- package/dist/agent-src/personas/brand-strategist.md +0 -1
- package/dist/agent-src/personas/data-integrity.md +66 -0
- package/dist/agent-src/personas/design-director.md +0 -1
- package/dist/agent-src/personas/performance-engineer.md +66 -0
- package/dist/agent-src/personas/production-validator.md +73 -0
- package/dist/agent-src/rules/agent-authority.md +3 -4
- package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
- package/dist/agent-src/rules/architecture.md +2 -4
- package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
- package/dist/agent-src/rules/artifact-engagement-recording.md +2 -4
- package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
- package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
- package/dist/agent-src/rules/autonomous-execution.md +3 -5
- package/dist/agent-src/rules/brand-consistency.md +3 -5
- package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
- package/dist/agent-src/rules/cli-output-handling.md +4 -6
- package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
- package/dist/agent-src/rules/commit-conventions.md +3 -5
- package/dist/agent-src/rules/commit-policy.md +8 -10
- package/dist/agent-src/rules/content-quoting-floor.md +88 -0
- package/dist/agent-src/rules/context-hygiene.md +3 -5
- package/dist/agent-src/rules/copilot-routing.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
- package/dist/agent-src/rules/delegation-policy.md +10 -6
- package/dist/agent-src/rules/design-fidelity.md +3 -5
- package/dist/agent-src/rules/devcontainer-routing.md +4 -6
- package/dist/agent-src/rules/direct-answers.md +13 -17
- package/dist/agent-src/rules/docker-commands.md +3 -5
- package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
- package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
- package/dist/agent-src/rules/domain-safety-pii.md +3 -5
- package/dist/agent-src/rules/domain-safety-retention.md +3 -5
- package/dist/agent-src/rules/downstream-changes.md +3 -4
- package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
- package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
- package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
- package/dist/agent-src/rules/finance-safety-floor.md +3 -6
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
- package/dist/agent-src/rules/git-history-discipline.md +3 -5
- package/dist/agent-src/rules/guidelines.md +2 -4
- package/dist/agent-src/rules/icon-consistency.md +3 -5
- package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
- package/dist/agent-src/rules/improve-before-implement.md +5 -5
- package/dist/agent-src/rules/invite-challenge.md +3 -5
- package/dist/agent-src/rules/language-and-tone.md +13 -15
- package/dist/agent-src/rules/laravel-routing.md +3 -5
- package/dist/agent-src/rules/laravel-translations.md +3 -5
- package/dist/agent-src/rules/legal-safety-floor.md +3 -5
- package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
- package/dist/agent-src/rules/media-governance-routing.md +3 -5
- package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
- package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
- package/dist/agent-src/rules/missing-tool-handling.md +3 -5
- package/dist/agent-src/rules/model-recommendation.md +4 -6
- package/dist/agent-src/rules/no-attribution-footers.md +3 -5
- package/dist/agent-src/rules/no-cheap-questions.md +5 -8
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
- package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
- package/dist/agent-src/rules/no-roadmap-references.md +3 -5
- package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
- package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
- package/dist/agent-src/rules/onboarding-gate.md +4 -6
- package/dist/agent-src/rules/output-discipline.md +3 -5
- package/dist/agent-src/rules/package-ci-checks.md +3 -5
- package/dist/agent-src/rules/persona-governance.md +2 -4
- package/dist/agent-src/rules/php-coding.md +3 -5
- package/dist/agent-src/rules/preservation-guard.md +2 -4
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
- package/dist/agent-src/rules/reviewer-awareness.md +5 -6
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
- package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
- package/dist/agent-src/rules/role-mode-adherence.md +2 -4
- package/dist/agent-src/rules/rule-type-governance.md +3 -5
- package/dist/agent-src/rules/runtime-safety.md +2 -4
- package/dist/agent-src/rules/scope-control.md +10 -11
- package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
- package/dist/agent-src/rules/size-enforcement.md +2 -4
- package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
- package/dist/agent-src/rules/skill-quality.md +3 -5
- package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
- package/dist/agent-src/rules/source-confidentiality.md +3 -5
- package/dist/agent-src/rules/source-discovery-gate.md +3 -5
- package/dist/agent-src/rules/source-of-truth.md +3 -5
- package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
- package/dist/agent-src/rules/symfony-routing.md +4 -6
- package/dist/agent-src/rules/telegraph-speak.md +4 -5
- package/dist/agent-src/rules/think-before-action.md +7 -4
- package/dist/agent-src/rules/token-budget-discipline.md +29 -5
- package/dist/agent-src/rules/token-efficiency.md +3 -5
- package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
- package/dist/agent-src/rules/tool-safety.md +2 -4
- package/dist/agent-src/rules/ui-audit-gate.md +3 -6
- package/dist/agent-src/rules/untrusted-input-defense.md +3 -5
- package/dist/agent-src/rules/upstream-proposal.md +4 -6
- package/dist/agent-src/rules/user-interaction.md +7 -5
- package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
- package/dist/agent-src/rules/verify-before-complete.md +12 -22
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
- package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
- package/dist/agent-src/skills/adr-create/SKILL.md +48 -42
- package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
- package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
- package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
- package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
- package/dist/agent-src/skills/brand/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
- package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -3
- package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
- package/dist/agent-src/skills/code-review/SKILL.md +1 -0
- package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
- package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
- package/dist/agent-src/skills/context-document/SKILL.md +17 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
- package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
- package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
- package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
- package/dist/agent-src/skills/design-intelligence/SKILL.md +5 -2
- package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
- package/dist/agent-src/skills/design-tokens/SKILL.md +10 -4
- package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
- package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
- package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
- package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
- package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
- package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
- package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
- package/dist/agent-src/skills/laravel/SKILL.md +0 -1
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
- package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
- package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
- package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
- package/dist/agent-src/skills/premortem/SKILL.md +0 -3
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
- package/dist/agent-src/skills/release-comms/SKILL.md +46 -45
- package/dist/agent-src/skills/roadmap-management/SKILL.md +21 -0
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +32 -2
- package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
- package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
- package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +29 -0
- package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
- package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
- package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
- package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
- package/dist/agent-src/templates/agent-settings.md +22 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
- package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
- package/dist/agent-src/templates/roadmaps.md +70 -2
- package/dist/agent-src/templates/rule.md +1 -1
- package/dist/agent-src/templates/scripts/README.md +3 -3
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
- package/dist/agent-src/templates/tickets.md +8 -8
- package/dist/cli/commands/recordTriggerEval.test.js +1 -1
- package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
- package/dist/cli/initRouting.js +4 -2
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +718 -240
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +8 -8
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +43 -28
- package/dist/discovery/trust-report.md +12 -11
- package/dist/discovery/workspaces.json +29 -18
- package/dist/install/preflight.js +173 -0
- package/dist/install/preflight.js.map +1 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +1 -1
- package/dist/server/routes/settings.js +4 -0
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/schemas/settings.js +3 -1
- package/dist/server/schemas/settings.js.map +1 -1
- package/docs/CLAIMS.md +108 -0
- package/docs/MIGRATION.md +3 -3
- package/docs/architecture.md +5 -5
- package/docs/benchmark.md +133 -2
- package/docs/benchmark.pinned.yml +31 -0
- package/docs/capability-matrix.md +1 -0
- package/docs/catalog.md +70 -60
- package/docs/command-flows.md +15 -3
- package/docs/comparison.yaml +35 -0
- package/docs/contracts/agents-layout.md +148 -0
- package/docs/contracts/brand-token-consumption.md +5 -0
- package/docs/contracts/capability-boundary.md +5 -0
- package/docs/contracts/command-category-governance.md +5 -0
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/command-surface-tiers.md +1 -1
- package/docs/contracts/conformance.md +84 -0
- package/docs/contracts/creative-pack-boundary.md +5 -0
- package/docs/contracts/discovery-manifest.schema.json +5 -4
- package/docs/contracts/file-ownership-matrix.json +4605 -985
- package/docs/contracts/governance-enforcement-projection.md +5 -0
- package/docs/contracts/gui-wizard.md +1 -1
- package/docs/contracts/hook-architecture-v1.md +2 -2
- package/docs/contracts/implement-ticket-flow.md +1 -1
- package/docs/contracts/kernel-membership.md +13 -0
- package/docs/contracts/mcp-tool-inventory.md +23 -23
- package/docs/contracts/no-runtime-boundary.md +6 -1
- package/docs/contracts/review-lens-schema.md +5 -0
- package/docs/contracts/rule-router.md +102 -8
- package/docs/contracts/skill-bundled-assets.md +1 -1
- package/docs/contracts/skill-dry-run.md +1 -1
- package/docs/contracts/subagent-boundary.md +5 -0
- package/docs/contracts/ticket-bundle-format.md +9 -4
- package/docs/contracts/tier-3-contrib-plugin.md +2 -2
- package/docs/contracts/write-engine.md +3 -0
- package/docs/customization.md +87 -15
- package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
- package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
- package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
- package/docs/decisions/INDEX.md +2 -0
- package/docs/distribution/awesome-list-submission.md +46 -0
- package/docs/distribution/launch-story-draft.md +58 -0
- package/docs/end-to-end-walkthroughs.md +2 -2
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
- package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
- package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
- package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
- package/docs/guidelines/augment-portability-patterns.md +1 -1
- package/docs/guidelines/code-clarity.md +19 -0
- package/docs/guidelines/design-antipatterns-triggers.json +2 -1
- package/docs/guidelines/design-antipatterns.md +10 -1
- package/docs/guidelines/design-modes.md +6 -0
- package/docs/guidelines/php/general.md +9 -1
- package/docs/guidelines/php/php-coding-patterns.md +7 -0
- package/docs/guides/cross-repo-retrieval.md +1 -1
- package/docs/guides/frontend-design-corpus-refresh.md +2 -2
- package/docs/guides/local-analytics.md +4 -4
- package/docs/guides/skill-discovery.md +1 -1
- package/docs/guides/skill-preview.md +1 -1
- package/docs/hook-payload-capture.md +6 -6
- package/docs/install-friction-report.md +66 -0
- package/docs/installation.md +1 -1
- package/docs/maintainers/optional-media-deps.md +50 -0
- package/docs/mcp-server.md +11 -12
- package/docs/media/proof-demo.cast +14 -0
- package/docs/media/proof-demo.gif +0 -0
- package/docs/migration/consumer-template-consumption-model.md +1 -1
- package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
- package/docs/migration/node-floor.md +1 -1
- package/docs/migration/yaml-roundtrip-spike.md +1 -1
- package/docs/personas.md +16 -5
- package/docs/positioning-evidence.md +86 -0
- package/docs/proof.md +86 -0
- package/docs/skills-catalog.md +1 -1
- package/docs/troubleshooting.md +8 -8
- package/docs/wedge/production-validator/README.md +57 -0
- package/docs/wedge/production-validator/production-validator.md +56 -0
- package/docs/wizard.md +2 -2
- package/package.json +1 -1
- package/src/config/agent-settings.template.yml +59 -4
- package/src/config/agents-paths.yml +254 -0
- package/src/config/budgets.yml +16 -0
- package/src/config/discovery/packs.yml +1 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/gitignore-block.txt +25 -0
- package/src/config/host-capabilities.yml +31 -0
- package/src/config/profiles/balanced.ini +4 -0
- package/src/config/profiles/full.ini +4 -0
- package/src/config/profiles/minimal.ini +4 -0
- package/src/scripts/_cli/cmd_conformance.ts +716 -0
- package/src/scripts/_cli/cmd_doctor.ts +23 -2
- package/src/scripts/_cli/cmd_fleet.ts +401 -0
- package/src/scripts/_cli/cmd_preflight.ts +159 -0
- package/src/scripts/_dispatch.bash +10 -0
- package/src/scripts/_lib/knowledge_events.ts +193 -0
- package/src/scripts/_lib/subagent_steering.ts +115 -3
- package/src/scripts/_lib/text_similarity.ts +75 -0
- package/src/scripts/ai-video/test-pipeline.sh +1 -1
- package/src/scripts/ai_council/clients.ts +19 -3
- package/src/scripts/append_contested.ts +112 -0
- package/src/scripts/audit_auto_rules.ts +11 -1
- package/src/scripts/audit_mcp_tools.ts +25 -11
- package/src/scripts/bench_ab_v2_run.ts +527 -40
- package/src/scripts/bench_ab_v2_stats.ts +6 -0
- package/src/scripts/bench_matrix.ts +266 -0
- package/src/scripts/bootstrap_knowledge.ts +267 -0
- package/src/scripts/build_discovery_manifest.ts +42 -2
- package/src/scripts/build_proof.ts +214 -0
- package/src/scripts/check_always_budget.ts +3 -0
- package/src/scripts/check_augment_description_cap.ts +2 -2
- package/src/scripts/check_claims.ts +270 -0
- package/src/scripts/check_comparison.ts +79 -0
- package/src/scripts/check_generated_artefact_headers.ts +109 -0
- package/src/scripts/check_generator_output_coverage.ts +142 -0
- package/src/scripts/check_gitignore_freshness.ts +127 -0
- package/src/scripts/check_knowledge_pages.ts +210 -0
- package/src/scripts/check_knowledge_sharing.ts +162 -0
- package/src/scripts/check_media_deps.ts +91 -0
- package/src/scripts/check_memory_contradiction.ts +280 -0
- package/src/scripts/check_memory_similarity.ts +134 -0
- package/src/scripts/check_quality_regression.ts +56 -10
- package/src/scripts/check_references.ts +3 -1
- package/src/scripts/check_release_pr_shape.ts +4 -0
- package/src/scripts/check_site_links.ts +135 -0
- package/src/scripts/check_skill_gaps.ts +99 -0
- package/src/scripts/check_token_quality_golden.ts +197 -11
- package/src/scripts/check_tracked_but_ignored.ts +67 -0
- package/src/scripts/cluster_near_miss_patterns.ts +0 -0
- package/src/scripts/compile_router.ts +30 -3
- package/src/scripts/condense.ts +350 -14
- package/src/scripts/consolidate_knowledge_events.ts +192 -0
- package/src/scripts/degrade_to_pointer.ts +136 -0
- package/src/scripts/design_slop_rules.test.ts +15 -0
- package/src/scripts/design_slop_rules.ts +28 -0
- package/src/scripts/emit_knowledge_event.ts +158 -0
- package/src/scripts/export_replay_corpus.ts +187 -0
- package/src/scripts/external_sources_denylist.json +7 -2
- package/src/scripts/fold_intake.ts +281 -0
- package/src/scripts/generate_capability_matrix.ts +9 -1
- package/src/scripts/generate_knowledge_index.ts +222 -0
- package/src/scripts/hook_manifest.yaml +26 -14
- package/src/scripts/hooks/dispatch_hook.ts +18 -0
- package/src/scripts/hot_context_hook.ts +372 -0
- package/src/scripts/install +47 -0
- package/src/scripts/install-hooks.sh +17 -0
- package/src/scripts/inventory_meta_layers.ts +11 -0
- package/src/scripts/janitor.ts +258 -0
- package/src/scripts/lint_agents_layout.ts +74 -15
- package/src/scripts/lint_bench_ab.ts +4 -1
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
- package/src/scripts/lint_knowledge_scale.ts +250 -0
- package/src/scripts/lint_legal_pack.ts +67 -0
- package/src/scripts/lint_persona_governance.ts +8 -3
- package/src/scripts/lint_regression.ts +15 -0
- package/src/scripts/lint_roadmap_blockers.ts +202 -0
- package/src/scripts/lint_roadmap_complexity.ts +81 -2
- package/src/scripts/lint_subagent_determinism.ts +125 -0
- package/src/scripts/measure_augment_budget.ts +46 -6
- package/src/scripts/measure_patterns.ts +4 -3
- package/src/scripts/measure_skill_reduction.ts +6 -6
- package/src/scripts/migration_status.ts +6 -2
- package/src/scripts/mine_missing_guardrails.ts +189 -0
- package/src/scripts/parity/phase_gate.ts +1 -1
- package/src/scripts/parity/replay.ts +21 -0
- package/src/scripts/project_thin_rules.ts +120 -16
- package/src/scripts/release.ts +39 -1
- package/src/scripts/render_benchmark_composite.ts +378 -0
- package/src/scripts/roadmap_progress_hook.ts +101 -43
- package/src/scripts/schemas/skill.schema.json +27 -0
- package/src/scripts/schemas/subagent.schema.json +106 -0
- package/src/scripts/skill_linter.ts +1 -0
- package/src/scripts/smoke/kernel.sh +5 -4
- package/src/scripts/surface-tiers.yml +1 -0
- package/src/scripts/sync_gitignore.ts +4 -0
- package/src/scripts/update_skill_candidates.ts +172 -0
- package/src/scripts/validate_frontmatter.ts +1 -0
|
@@ -42,6 +42,9 @@ const COUNCIL_PAT = /^## Council Round \d+\b/m;
|
|
|
42
42
|
const VERDICT_PAT = /^### Verdict\b/m;
|
|
43
43
|
// re.compile(r"^complexity:\s*(lightweight|structural)\s*$", re.MULTILINE)
|
|
44
44
|
const COMPLEXITY_PAT = /^complexity:\s*(lightweight|structural)\s*$/m;
|
|
45
|
+
// execution.mode (templates/roadmaps.md rule 18): nested under `execution:`.
|
|
46
|
+
const EXEC_MODE_PAT = /^execution:[^\S\n]*\n(?:[ \t]+(?!mode:).*\n)*[ \t]+mode:[ \t]*([^\s#]+)/m;
|
|
47
|
+
const EXEC_MODE_VALUES = new Set(['autonomous', 'phase-checkpoints', 'interactive']);
|
|
45
48
|
|
|
46
49
|
// Plate / horizon detection — template rule 16 forbids time-boxed plates.
|
|
47
50
|
const PLATE_PATS: ReadonlyArray<readonly [RegExp, string]> = [
|
|
@@ -161,7 +164,11 @@ function _check_no_plate(text: string, problems: string[]): void {
|
|
|
161
164
|
}
|
|
162
165
|
}
|
|
163
166
|
|
|
164
|
-
function lint_roadmap(
|
|
167
|
+
function lint_roadmap(
|
|
168
|
+
p: string,
|
|
169
|
+
horizon_weeks: number,
|
|
170
|
+
warnings?: string[],
|
|
171
|
+
): string[] {
|
|
165
172
|
const text = fs.readFileSync(p, 'utf-8');
|
|
166
173
|
const line_count = _countChar(text, '\n') + (text && !text.endsWith('\n') ? 1 : 0);
|
|
167
174
|
const problems: string[] = [];
|
|
@@ -180,9 +187,77 @@ function lint_roadmap(p: string, horizon_weeks: number): string[] {
|
|
|
180
187
|
if (horizon_weeks <= 0) {
|
|
181
188
|
_check_no_plate(text, problems);
|
|
182
189
|
}
|
|
190
|
+
_check_execution_mode(fm, problems);
|
|
191
|
+
if (warnings) {
|
|
192
|
+
_check_autonomous_authoring(text, fm, warnings);
|
|
193
|
+
}
|
|
183
194
|
return problems;
|
|
184
195
|
}
|
|
185
196
|
|
|
197
|
+
// Vague-step patterns (ask-when-uncertain trigger subset) — under
|
|
198
|
+
// execution.mode: autonomous these guarantee mid-run ambiguity halts,
|
|
199
|
+
// so they warn at authoring time instead. Warnings never fail the lint.
|
|
200
|
+
const VAGUE_STEP_PATS: Array<[RegExp, string]> = [
|
|
201
|
+
[/\b(improve|optimi[sz]e)\b(?!.*\bby\b)/i, "'improve / optimize' without a measurable target"],
|
|
202
|
+
[/\bmake (it|this|.{0,30}) (better|cleaner|nicer)\b/i, "'make it better/cleaner'"],
|
|
203
|
+
[/\bclean ?up\b(?!.*\(<)/i, "'clean up' without named scope"],
|
|
204
|
+
[/\bfix (this|it)\b/i, "'fix this' without a symptom"],
|
|
205
|
+
[/\buse best practices\b/i, "'use best practices'"],
|
|
206
|
+
[/\bhandle errors properly\b/i, "'handle errors properly'"],
|
|
207
|
+
];
|
|
208
|
+
|
|
209
|
+
function _check_autonomous_authoring(text: string, fm: string, warnings: string[]): void {
|
|
210
|
+
const m = EXEC_MODE_PAT.exec(fm);
|
|
211
|
+
if (m === null || m[1]!.replace(/^['"]|['"]$/g, '') !== 'autonomous') {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const deferred = _countMatches(/^\s*-\s*\[~\]/m, text);
|
|
215
|
+
if (deferred > 0) {
|
|
216
|
+
warnings.push(
|
|
217
|
+
`execution.mode: autonomous with ${deferred} pre-existing [~] deferred item(s) — ` +
|
|
218
|
+
'the deferred-resolution archival gate (roadmap-progress-sync Iron Law 3) ' +
|
|
219
|
+
'WILL interrupt the run at the end; resolve or re-author them now',
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
for (const rawLine of text.split('\n')) {
|
|
223
|
+
if (!/^\s*-\s*\[ \]/.test(rawLine)) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
for (const [re, label] of VAGUE_STEP_PATS) {
|
|
227
|
+
if (re.test(rawLine)) {
|
|
228
|
+
warnings.push(
|
|
229
|
+
`vague step under execution.mode: autonomous (${label}): ` +
|
|
230
|
+
`"${rawLine.trim().slice(0, 80)}" — vagueness resolves cheaply at ` +
|
|
231
|
+
'authoring time, expensively as a mid-run ambiguity halt',
|
|
232
|
+
);
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function _check_execution_mode(fm: string, problems: string[]): void {
|
|
240
|
+
if (!fm || !/^execution:/m.test(fm)) {
|
|
241
|
+
return; // absent field = interactive default — valid
|
|
242
|
+
}
|
|
243
|
+
const m = EXEC_MODE_PAT.exec(fm);
|
|
244
|
+
if (m === null) {
|
|
245
|
+
problems.push(
|
|
246
|
+
"'execution:' frontmatter block present but no 'mode:' key found " +
|
|
247
|
+
"(expected execution.mode: autonomous | phase-checkpoints | interactive " +
|
|
248
|
+
'per templates/roadmaps.md rule 18)',
|
|
249
|
+
);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const value = m[1]!.replace(/^['"]|['"]$/g, '');
|
|
253
|
+
if (!EXEC_MODE_VALUES.has(value)) {
|
|
254
|
+
problems.push(
|
|
255
|
+
`unknown execution.mode '${value}' — allowed: autonomous | ` +
|
|
256
|
+
'phase-checkpoints | interactive (templates/roadmaps.md rule 18)',
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
186
261
|
function main(): number {
|
|
187
262
|
const roadmaps = _globRoadmaps();
|
|
188
263
|
const horizon_weeks = _read_horizon_weeks();
|
|
@@ -196,7 +271,11 @@ function main(): number {
|
|
|
196
271
|
const summary: Array<[string, string]> = [];
|
|
197
272
|
for (const roadmap of roadmaps) {
|
|
198
273
|
const rel = _relPosix(roadmap, REPO_ROOT);
|
|
199
|
-
const
|
|
274
|
+
const warnings: string[] = [];
|
|
275
|
+
const problems = lint_roadmap(roadmap, horizon_weeks, warnings);
|
|
276
|
+
for (const w of warnings) {
|
|
277
|
+
process.stderr.write(`⚠️ ${rel}\n - ${w}\n`);
|
|
278
|
+
}
|
|
200
279
|
const text = fs.readFileSync(roadmap, 'utf-8');
|
|
201
280
|
const complexity = _read_complexity(_frontmatter(text)) ?? 'untagged';
|
|
202
281
|
summary.push([rel, complexity]);
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Lint subagent determinism — the ADR-109 guarantees the schema mini-validator
|
|
4
|
+
* cannot express.
|
|
5
|
+
*
|
|
6
|
+
* `validate_frontmatter` (the schema gate) covers type / enum / required /
|
|
7
|
+
* pattern, but its mini-validator ignores JSON-Schema `const` and `uniqueItems`.
|
|
8
|
+
* This lint closes that gap for `src/subagents/*.md`:
|
|
9
|
+
*
|
|
10
|
+
* 1. `schema_version` MUST equal `subagent-v1` (schema `const`).
|
|
11
|
+
* 2. `discovery.visible` MUST be exactly `false` — default-off (schema `const`).
|
|
12
|
+
* 3. `tools` MUST have no duplicate entries (schema `uniqueItems`).
|
|
13
|
+
* 4. `name` MUST match the filename stem (addressable-handle invariant).
|
|
14
|
+
* 5. `name` MUST be globally unique across the subagent category
|
|
15
|
+
* (projection-path collision guard — two units would overwrite each other
|
|
16
|
+
* in `.claude/agents/`).
|
|
17
|
+
*
|
|
18
|
+
* Exit codes: 0 clean, 1 any violation.
|
|
19
|
+
*
|
|
20
|
+
* See ADR-109 (§ 6 determinism) and `src/scripts/schemas/subagent.schema.json`.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import * as fs from 'node:fs';
|
|
24
|
+
import * as path from 'node:path';
|
|
25
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
26
|
+
|
|
27
|
+
import { parse_frontmatter } from './validate_frontmatter.js';
|
|
28
|
+
|
|
29
|
+
const QUIET = process.argv.includes('--quiet');
|
|
30
|
+
|
|
31
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
32
|
+
const REPO = path.resolve(path.dirname(_HERE), '..', '..');
|
|
33
|
+
const SUBAGENT_DIR = path.join(REPO, 'src', 'subagents');
|
|
34
|
+
|
|
35
|
+
function _listSubagents(dir: string): string[] {
|
|
36
|
+
if (!fs.existsSync(dir)) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
return fs
|
|
40
|
+
.readdirSync(dir)
|
|
41
|
+
.filter((f) => f.endsWith('.md'))
|
|
42
|
+
.sort()
|
|
43
|
+
.map((f) => path.join(dir, f));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function main(dir: string = SUBAGENT_DIR): number {
|
|
47
|
+
const findings: string[] = [];
|
|
48
|
+
const namesSeen = new Map<string, string>();
|
|
49
|
+
|
|
50
|
+
for (const file of _listSubagents(dir)) {
|
|
51
|
+
const rel = path.relative(REPO, file);
|
|
52
|
+
const stem = path.basename(file, '.md');
|
|
53
|
+
const text = fs.readFileSync(file, 'utf-8');
|
|
54
|
+
const [data] = parse_frontmatter(text);
|
|
55
|
+
if (data === null || typeof data !== 'object' || Array.isArray(data)) {
|
|
56
|
+
findings.push(`${rel}: no parseable frontmatter`);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const fm = data as Record<string, unknown>;
|
|
60
|
+
|
|
61
|
+
if (fm.schema_version !== 'subagent-v1') {
|
|
62
|
+
findings.push(`${rel}: schema_version must be 'subagent-v1' (got ${JSON.stringify(fm.schema_version)})`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const discovery = fm.discovery;
|
|
66
|
+
const visible =
|
|
67
|
+
discovery !== null && typeof discovery === 'object' && !Array.isArray(discovery)
|
|
68
|
+
? (discovery as Record<string, unknown>).visible
|
|
69
|
+
: undefined;
|
|
70
|
+
if (visible !== false) {
|
|
71
|
+
findings.push(`${rel}: discovery.visible must be exactly false (default-off; got ${JSON.stringify(visible)})`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const tools = fm.tools;
|
|
75
|
+
if (Array.isArray(tools)) {
|
|
76
|
+
const seen = new Set<unknown>();
|
|
77
|
+
const dupes = new Set<unknown>();
|
|
78
|
+
for (const t of tools) {
|
|
79
|
+
if (seen.has(t)) {
|
|
80
|
+
dupes.add(t);
|
|
81
|
+
}
|
|
82
|
+
seen.add(t);
|
|
83
|
+
}
|
|
84
|
+
if (dupes.size > 0) {
|
|
85
|
+
findings.push(`${rel}: tools has duplicate entr(y/ies): ${[...dupes].map((d) => JSON.stringify(d)).join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const name = fm.name;
|
|
90
|
+
if (typeof name !== 'string' || name !== stem) {
|
|
91
|
+
findings.push(`${rel}: name must match the filename stem '${stem}' (got ${JSON.stringify(name)})`);
|
|
92
|
+
} else {
|
|
93
|
+
const prior = namesSeen.get(name);
|
|
94
|
+
if (prior !== undefined) {
|
|
95
|
+
findings.push(`${rel}: duplicate subagent name '${name}' (also in ${prior}) — projection-path collision`);
|
|
96
|
+
} else {
|
|
97
|
+
namesSeen.set(name, rel);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (findings.length > 0) {
|
|
103
|
+
process.stdout.write('❌ subagent determinism:\n');
|
|
104
|
+
for (const f of findings.sort()) {
|
|
105
|
+
process.stdout.write(` - ${f}\n`);
|
|
106
|
+
}
|
|
107
|
+
return 1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (!QUIET) {
|
|
111
|
+
process.stdout.write(
|
|
112
|
+
`✅ subagent determinism: ${namesSeen.size} subagent(s) clean.\n`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const _isCliEntry =
|
|
119
|
+
process.argv[1] !== undefined &&
|
|
120
|
+
import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
121
|
+
if (_isCliEntry) {
|
|
122
|
+
process.exit(main());
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export { main };
|
|
@@ -16,8 +16,10 @@
|
|
|
16
16
|
* 2. `always`-type rules under `.augment/rules/` — full body injected.
|
|
17
17
|
* 3. `auto`-type rules — only a registry stub is injected per rule.
|
|
18
18
|
*
|
|
19
|
-
* The
|
|
20
|
-
*
|
|
19
|
+
* The cap comes from `src/config/budgets.yml`
|
|
20
|
+
* (augment_workspace_guidelines) — the single source of truth for the
|
|
21
|
+
* budget gates. The internal cap is deliberately below the verified
|
|
22
|
+
* platform maximum recorded there.
|
|
21
23
|
*
|
|
22
24
|
* Exit codes: 0 = under fail threshold, 1 = at/above fail threshold,
|
|
23
25
|
* 3 = internal error.
|
|
@@ -39,10 +41,48 @@ export const TREND_FILE = path.join(
|
|
|
39
41
|
'.augment-budget-history.jsonl',
|
|
40
42
|
);
|
|
41
43
|
|
|
42
|
-
//
|
|
43
|
-
export const
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
// Budget caps — loaded from src/config/budgets.yml (single source of truth).
|
|
45
|
+
export const BUDGETS_FILE = path.join(REPO_ROOT, 'src', 'config', 'budgets.yml');
|
|
46
|
+
|
|
47
|
+
interface BudgetConfig {
|
|
48
|
+
platform_max_chars: number;
|
|
49
|
+
total_cap_chars: number;
|
|
50
|
+
warn_threshold: number;
|
|
51
|
+
fail_threshold: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function _load_budget_config(): BudgetConfig {
|
|
55
|
+
// Tiny purpose-built reader (keys are flat scalars) — avoids a hard yaml
|
|
56
|
+
// dependency in a script that must run before `npm ci` in some flows.
|
|
57
|
+
const text = fs.readFileSync(BUDGETS_FILE, 'utf-8');
|
|
58
|
+
const section = text.split(/^augment_workspace_guidelines:\s*$/m)[1] ?? '';
|
|
59
|
+
const num = (key: string): number => {
|
|
60
|
+
const m = new RegExp(`^\\s+${key}:\\s*([0-9.]+)\\s*$`, 'm').exec(section);
|
|
61
|
+
if (!m) {
|
|
62
|
+
throw new Error(`budgets.yml: missing augment_workspace_guidelines.${key}`);
|
|
63
|
+
}
|
|
64
|
+
return Number(m[1]);
|
|
65
|
+
};
|
|
66
|
+
const cfg: BudgetConfig = {
|
|
67
|
+
platform_max_chars: num('platform_max_chars'),
|
|
68
|
+
total_cap_chars: num('total_cap_chars'),
|
|
69
|
+
warn_threshold: num('warn_threshold'),
|
|
70
|
+
fail_threshold: num('fail_threshold'),
|
|
71
|
+
};
|
|
72
|
+
if (cfg.total_cap_chars > cfg.platform_max_chars) {
|
|
73
|
+
throw new Error(
|
|
74
|
+
`budgets.yml: total_cap_chars (${cfg.total_cap_chars}) must never exceed ` +
|
|
75
|
+
`platform_max_chars (${cfg.platform_max_chars})`,
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
return cfg;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const _BUDGET = _load_budget_config();
|
|
82
|
+
export const PLATFORM_MAX = _BUDGET.platform_max_chars;
|
|
83
|
+
export const TOTAL_CAP = _BUDGET.total_cap_chars;
|
|
84
|
+
export const WARN_THRESHOLD = _BUDGET.warn_threshold;
|
|
85
|
+
export const FAIL_THRESHOLD = _BUDGET.fail_threshold;
|
|
46
86
|
|
|
47
87
|
// Stub template Augment injects for `type: auto` rules.
|
|
48
88
|
function STUB(desc: string, p: string): string {
|
|
@@ -21,8 +21,9 @@
|
|
|
21
21
|
* 7. Runtime boundary disclaimer
|
|
22
22
|
* 8. Anti-sycophancy rules in "Do NOT"
|
|
23
23
|
*
|
|
24
|
-
* NOTE:
|
|
25
|
-
*
|
|
24
|
+
* NOTE: scans `src/skills` — the canonical source-of-truth skill library.
|
|
25
|
+
* (The pre-py2ts .py read the now-removed legacy condensed-source skills
|
|
26
|
+
* corpus; repointed here so the scanner runs on the live tree.)
|
|
26
27
|
*/
|
|
27
28
|
|
|
28
29
|
import * as fs from 'node:fs';
|
|
@@ -32,7 +33,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
32
33
|
const _HERE = fileURLToPath(import.meta.url);
|
|
33
34
|
// src/scripts/measure_patterns.ts → parents[2] is the repo root.
|
|
34
35
|
const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
35
|
-
const SKILLS_DIR = path.join(ROOT, '
|
|
36
|
+
const SKILLS_DIR = path.join(ROOT, 'src', 'skills');
|
|
36
37
|
|
|
37
38
|
type Tier = number | string;
|
|
38
39
|
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
* measure_skill_reduction
|
|
21
21
|
* measure_skill_reduction --json
|
|
22
22
|
*
|
|
23
|
-
* NOTE:
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* (iterdir on a missing dir) →
|
|
27
|
-
*
|
|
23
|
+
* NOTE: scans `src/skills` — the canonical source-of-truth skill library.
|
|
24
|
+
* (The pre-py2ts .py read the now-removed legacy condensed-source skills
|
|
25
|
+
* corpus; repointed here so the scanner runs on the live tree.) When
|
|
26
|
+
* the directory is absent the scanner throws (iterdir on a missing dir) →
|
|
27
|
+
* non-zero exit, empty stdout.
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
30
|
import * as fs from 'node:fs';
|
|
@@ -35,7 +35,7 @@ import { parse as parseYaml } from 'yaml';
|
|
|
35
35
|
const _HERE = fileURLToPath(import.meta.url);
|
|
36
36
|
// src/scripts/measure_skill_reduction.ts → parents[2] is the repo root.
|
|
37
37
|
const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
38
|
-
const SKILLS_DIR = path.join(REPO_ROOT, '
|
|
38
|
+
const SKILLS_DIR = path.join(REPO_ROOT, 'src', 'skills');
|
|
39
39
|
const TARGET_REDUCTION = 0.4;
|
|
40
40
|
const PHASE_3_USER_TYPES = ['consultant', 'creator'] as const;
|
|
41
41
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* migration_status.ts — Python→TypeScript migration dashboard.
|
|
4
4
|
*
|
|
5
|
-
* Phase 1 Step 13 of `agents/roadmaps/road-to-typescript-only-scripts.md`.
|
|
5
|
+
* Phase 1 Step 13 of `agents/roadmaps/archive/road-to-typescript-only-scripts.md`.
|
|
6
6
|
*
|
|
7
7
|
* Counts the remaining tracked `.py` files (via `git ls-files '*.py'`),
|
|
8
8
|
* buckets them into the roadmap's migration categories, compares each
|
|
@@ -100,6 +100,10 @@ const EXCLUDED_PREFIXES: readonly string[] = [
|
|
|
100
100
|
'.claude/',
|
|
101
101
|
'.augment/',
|
|
102
102
|
'internal/bench/',
|
|
103
|
+
// Eval fixtures simulate CONSUMER project files (a python DB model the
|
|
104
|
+
// structure-grounding eval reads as foreign source) — carve-out, not
|
|
105
|
+
// package source. Same class as the internal/bench/ trap fixtures.
|
|
106
|
+
'internal/evals/',
|
|
103
107
|
'tmp/',
|
|
104
108
|
'.tmp/',
|
|
105
109
|
];
|
|
@@ -225,7 +229,7 @@ function renderDashboard(
|
|
|
225
229
|
lines.push('');
|
|
226
230
|
lines.push(
|
|
227
231
|
'Tracks remaining tracked `.py` files per roadmap phase of ' +
|
|
228
|
-
'`agents/roadmaps/road-to-typescript-only-scripts.md`. ' +
|
|
232
|
+
'`agents/roadmaps/archive/road-to-typescript-only-scripts.md`. ' +
|
|
229
233
|
'Baseline = Phase 1 snapshot (hardcoded in the script).',
|
|
230
234
|
);
|
|
231
235
|
lines.push('');
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* A4 — Ablation-mining (learning-loop #1). Correlate rule *absence* with failure
|
|
4
|
+
* across INDEPENDENT runs (distinct `work_id`) and surface *missing-guardrail*
|
|
5
|
+
* candidates for the human to promote via `learning-to-rule-or-skill`.
|
|
6
|
+
*
|
|
7
|
+
* Read-only over `audit-log-v1` (`agents/runtime/state/audit/*.jsonl`). Raw
|
|
8
|
+
* counts only — NO auto-promotion, NO mutation. Correlation, not causation:
|
|
9
|
+
* every candidate carries the confounding caveat. A candidate is a *question*
|
|
10
|
+
* for a human, never an answer.
|
|
11
|
+
*
|
|
12
|
+
* Signal (per phase P, rule R):
|
|
13
|
+
* - `success_with_rule` = success lines in P where R ∈ rules_applied
|
|
14
|
+
* - `failure_without_rule` = blocked/error lines in P where R ∉ rules_applied
|
|
15
|
+
* R is a candidate when its absence co-occurs with failure often enough
|
|
16
|
+
* (`failure_without_rule` ≥ --min-count, over ≥2 distinct failing work_ids)
|
|
17
|
+
* AND R is otherwise a success-associated rule in P (`success_with_rule` ≥ 1).
|
|
18
|
+
*
|
|
19
|
+
* Exit 0 always (an empty audit log is a valid state, not an error).
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'node:fs';
|
|
22
|
+
import * as path from 'node:path';
|
|
23
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
24
|
+
|
|
25
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
26
|
+
export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
27
|
+
export const DEFAULT_AUDIT_DIR = path.join(ROOT, 'agents', 'runtime', 'state', 'audit');
|
|
28
|
+
export const SCHEMA_VERSION = 1;
|
|
29
|
+
const FAILURE_OUTCOMES = new Set(['blocked', 'error']);
|
|
30
|
+
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
type Rec = Record<string, any>;
|
|
33
|
+
|
|
34
|
+
/** Read audit-log-v1 phase records from `*.jsonl` (or one `<month>.jsonl`). */
|
|
35
|
+
export function loadRecords(auditDir: string, month: string | null = null): Rec[] {
|
|
36
|
+
const out: Rec[] = [];
|
|
37
|
+
let files: string[];
|
|
38
|
+
if (month) {
|
|
39
|
+
files = [path.join(auditDir, `${month}.jsonl`)];
|
|
40
|
+
} else {
|
|
41
|
+
let names: string[] = [];
|
|
42
|
+
try {
|
|
43
|
+
names = fs.readdirSync(auditDir);
|
|
44
|
+
} catch {
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
files = names.filter((n) => n.endsWith('.jsonl')).sort().map((n) => path.join(auditDir, n));
|
|
48
|
+
}
|
|
49
|
+
for (const p of files) {
|
|
50
|
+
let text: string;
|
|
51
|
+
try {
|
|
52
|
+
text = fs.readFileSync(p, 'utf-8');
|
|
53
|
+
} catch {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
for (const raw of text.split('\n')) {
|
|
57
|
+
const line = raw.trim();
|
|
58
|
+
if (!line) continue;
|
|
59
|
+
let rec: Rec;
|
|
60
|
+
try {
|
|
61
|
+
rec = JSON.parse(line) as Rec;
|
|
62
|
+
} catch {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (rec.schema_version !== SCHEMA_VERSION) continue;
|
|
66
|
+
if (rec.type === 'supersede' || rec.type === 'note') continue;
|
|
67
|
+
if (typeof rec.phase !== 'string' || typeof rec.outcome !== 'string') continue;
|
|
68
|
+
if (!Array.isArray(rec.rules_applied)) continue;
|
|
69
|
+
out.push(rec);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface Candidate {
|
|
76
|
+
phase: string;
|
|
77
|
+
rule: string;
|
|
78
|
+
success_with_rule: number;
|
|
79
|
+
failure_without_rule: number;
|
|
80
|
+
failure_work_ids: string[];
|
|
81
|
+
success_without_rule: number;
|
|
82
|
+
failure_with_rule: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function mineCandidates(records: Rec[], minCount: number): Candidate[] {
|
|
86
|
+
const phases = new Set<string>();
|
|
87
|
+
const rules = new Set<string>();
|
|
88
|
+
for (const r of records) {
|
|
89
|
+
phases.add(r.phase as string);
|
|
90
|
+
for (const rule of r.rules_applied as string[]) rules.add(rule);
|
|
91
|
+
}
|
|
92
|
+
const out: Candidate[] = [];
|
|
93
|
+
for (const phase of [...phases].sort()) {
|
|
94
|
+
const inPhase = records.filter((r) => r.phase === phase);
|
|
95
|
+
for (const rule of [...rules].sort()) {
|
|
96
|
+
let succWith = 0;
|
|
97
|
+
let succWithout = 0;
|
|
98
|
+
let failWith = 0;
|
|
99
|
+
const failWithoutIds = new Set<string>();
|
|
100
|
+
for (const r of inPhase) {
|
|
101
|
+
const has = (r.rules_applied as string[]).includes(rule);
|
|
102
|
+
const isSuccess = r.outcome === 'success';
|
|
103
|
+
const isFailure = FAILURE_OUTCOMES.has(r.outcome as string);
|
|
104
|
+
if (isSuccess && has) succWith += 1;
|
|
105
|
+
else if (isSuccess && !has) succWithout += 1;
|
|
106
|
+
else if (isFailure && has) failWith += 1;
|
|
107
|
+
else if (isFailure && !has) {
|
|
108
|
+
failWithoutIds.add(typeof r.work_id === 'string' ? r.work_id : (r.id as string));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const failWithout = failWithoutIds.size;
|
|
112
|
+
// Candidate: absence co-occurs with failure across ≥2 distinct runs,
|
|
113
|
+
// and the rule is otherwise success-associated in this phase.
|
|
114
|
+
if (failWithout >= minCount && failWithout >= 2 && succWith >= 1) {
|
|
115
|
+
out.push({
|
|
116
|
+
phase,
|
|
117
|
+
rule,
|
|
118
|
+
success_with_rule: succWith,
|
|
119
|
+
failure_without_rule: failWithout,
|
|
120
|
+
failure_work_ids: [...failWithoutIds].sort(),
|
|
121
|
+
success_without_rule: succWithout,
|
|
122
|
+
failure_with_rule: failWith,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Strongest signal first: most distinct failing runs, then most successes-with.
|
|
128
|
+
out.sort(
|
|
129
|
+
(a, b) =>
|
|
130
|
+
b.failure_without_rule - a.failure_without_rule ||
|
|
131
|
+
b.success_with_rule - a.success_with_rule ||
|
|
132
|
+
(a.phase < b.phase ? -1 : a.phase > b.phase ? 1 : a.rule < b.rule ? -1 : 1),
|
|
133
|
+
);
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const CONFOUND_NOTE =
|
|
138
|
+
'Correlation, NOT causation. A rule absent from failing runs may reflect the ' +
|
|
139
|
+
'task type or phase shape, not a missing guardrail. Low N inflates noise. ' +
|
|
140
|
+
'Each candidate is a question for a human — promote (or reject) only via ' +
|
|
141
|
+
'learning-to-rule-or-skill. Never auto-add a rule from this output.';
|
|
142
|
+
|
|
143
|
+
export function main(argv: string[] = process.argv.slice(2)): number {
|
|
144
|
+
let auditDir = DEFAULT_AUDIT_DIR;
|
|
145
|
+
let month: string | null = null;
|
|
146
|
+
let minCount = 2;
|
|
147
|
+
let asJson = false;
|
|
148
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
149
|
+
const a = argv[i];
|
|
150
|
+
if (a === '--audit-dir') auditDir = argv[++i] ?? auditDir;
|
|
151
|
+
else if (a === '--month') month = argv[++i] ?? null;
|
|
152
|
+
else if (a === '--min-count') minCount = parseInt(argv[++i] ?? '2', 10) || 2;
|
|
153
|
+
else if (a === '--json') asJson = true;
|
|
154
|
+
}
|
|
155
|
+
const records = loadRecords(auditDir, month);
|
|
156
|
+
const candidates = mineCandidates(records, minCount);
|
|
157
|
+
if (asJson) {
|
|
158
|
+
process.stdout.write(
|
|
159
|
+
JSON.stringify(
|
|
160
|
+
{ schema_version: SCHEMA_VERSION, records: records.length, min_count: minCount, confounding: CONFOUND_NOTE, candidates },
|
|
161
|
+
null,
|
|
162
|
+
2,
|
|
163
|
+
) + '\n',
|
|
164
|
+
);
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
if (records.length === 0) {
|
|
168
|
+
process.stdout.write('missing-guardrails: no audit-log-v1 records found (nothing to mine).\n');
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
if (candidates.length === 0) {
|
|
172
|
+
process.stdout.write(`missing-guardrails: ${records.length} record(s), 0 candidates (min-count ${minCount}).\n`);
|
|
173
|
+
return 0;
|
|
174
|
+
}
|
|
175
|
+
process.stdout.write(`missing-guardrails: ${candidates.length} candidate(s) from ${records.length} record(s):\n\n`);
|
|
176
|
+
for (const c of candidates) {
|
|
177
|
+
process.stdout.write(
|
|
178
|
+
` [${c.phase}] rule '${c.rule}' — absent in ${c.failure_without_rule} failing run(s), ` +
|
|
179
|
+
`present in ${c.success_with_rule} success(es). ` +
|
|
180
|
+
`(fail-with-rule ${c.failure_with_rule}, success-without ${c.success_without_rule})\n`,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
process.stdout.write(`\n⚠️ ${CONFOUND_NOTE}\n`);
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const _isCli =
|
|
188
|
+
process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
189
|
+
if (_isCli) process.exit(main());
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* phase_gate.ts — Python→TypeScript migration phase gate.
|
|
4
4
|
*
|
|
5
|
-
* Phase 1 Step 10 of `agents/roadmaps/road-to-typescript-only-scripts.md`.
|
|
5
|
+
* Phase 1 Step 10 of `agents/roadmaps/archive/road-to-typescript-only-scripts.md`.
|
|
6
6
|
*
|
|
7
7
|
* Reads `src/scripts/parity/phase-manifest.json` and enforces:
|
|
8
8
|
*
|
|
@@ -196,6 +196,27 @@ export function runReplay(options: ReplayOptions): ReplayReport {
|
|
|
196
196
|
const tsScript = `${scriptBase}.ts`;
|
|
197
197
|
const tsxCommand = resolveTsxCommand(cwd);
|
|
198
198
|
|
|
199
|
+
// Local python-skip guard (teardown D2): the replay harness is migration
|
|
200
|
+
// tooling — it byte-compares a live `python3 <script>.py` run against the
|
|
201
|
+
// tsx twin, which requires BOTH the runtime and the original `.py` to
|
|
202
|
+
// exist. Post-teardown neither holds; fail fast with a clear message
|
|
203
|
+
// instead of a spawn error, so the python-free-env shim retirement does
|
|
204
|
+
// not depend on porting this harness to a frozen-golden design.
|
|
205
|
+
if (spawnSync("python3", ["--version"], { encoding: "utf8" }).status !== 0) {
|
|
206
|
+
return {
|
|
207
|
+
script: options.script,
|
|
208
|
+
status: "fail",
|
|
209
|
+
cases: options.caseDirs.map((caseDir) => ({
|
|
210
|
+
caseDir,
|
|
211
|
+
diffs: [],
|
|
212
|
+
error:
|
|
213
|
+
"python3 unavailable — the golden-replay harness needs the pre-teardown " +
|
|
214
|
+
"python runtime plus the original .py; freeze the baseline to a TS golden " +
|
|
215
|
+
"instead (teardown D2 medium-term).",
|
|
216
|
+
})),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
199
220
|
const cases: CaseResult[] = [];
|
|
200
221
|
for (const caseDirRaw of options.caseDirs) {
|
|
201
222
|
const caseDir = path.resolve(cwd, caseDirRaw);
|