@event4u/agent-config 9.9.0 → 9.11.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 +1 -1
- package/CHANGELOG.md +212 -194
- package/README.md +13 -16
- package/agents/templates/.ai-council.yml.example +481 -0
- package/agents/templates/.ai-video.xml.example +247 -0
- package/dist/agent-src/commands/agent-status.md +12 -11
- package/dist/agent-src/commands/agents/user/accept.md +115 -30
- package/dist/agent-src/commands/agents/user/delete.md +147 -0
- package/dist/agent-src/commands/agents/user/review.md +65 -28
- package/dist/agent-src/commands/agents/user/show.md +82 -29
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +16 -3
- package/dist/agent-src/commands/check-current-md.md +0 -10
- package/dist/agent-src/commands/condense.md +28 -97
- package/dist/agent-src/commands/cost/report.md +7 -0
- package/dist/agent-src/commands/fix/portability.md +0 -8
- package/dist/agent-src/commands/fix/refs.md +0 -8
- package/dist/agent-src/commands/humanize.md +2 -2
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/load.md +11 -0
- package/dist/agent-src/commands/optimize/skills.md +1 -1
- package/dist/agent-src/commands/pr/create.md +4 -4
- package/dist/agent-src/commands/profile/show.md +3 -3
- package/dist/agent-src/commands/rule-compliance-audit.md +5 -4
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tdd.md +21 -0
- package/dist/agent-src/commands/team/delegate.md +2 -2
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +9 -8
- package/dist/agent-src/commands/team-knowledge/consolidate.md +8 -7
- package/dist/agent-src/commands/team.md +4 -1
- package/dist/agent-src/commands/upstream-contribute.md +0 -1
- package/dist/agent-src/contexts/authority/commit-mechanics.md +7 -0
- package/dist/agent-src/contexts/authority/destructive-mechanics.md +16 -0
- package/dist/agent-src/contexts/authority/scope-mechanics.md +61 -0
- package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +20 -18
- package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/source-of-truth-mechanics.md +9 -10
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +11 -0
- package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +26 -15
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +3 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +67 -37
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +7 -6
- package/dist/agent-src/contexts/execution/evidence-discipline.md +92 -77
- package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +22 -21
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +24 -0
- package/dist/agent-src/contexts/execution/project-intelligence.md +122 -103
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +23 -21
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +5 -5
- package/dist/agent-src/contexts/execution/subagent-routing.md +11 -0
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +13 -13
- package/dist/agent-src/contexts/execution/subagent-steering.md +36 -34
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +189 -0
- package/dist/agent-src/contexts/execution/verification-mechanics.md +9 -0
- package/dist/agent-src/contexts/model-recommendations.md +3 -2
- package/dist/agent-src/contexts/subagent-configuration.md +3 -3
- package/dist/agent-src/ghostwriter/README.md +2 -2
- package/dist/agent-src/packs/README.md +1 -1
- package/dist/agent-src/personas/README.md +5 -5
- package/dist/agent-src/personas/_template-specialist/persona.md +3 -3
- package/dist/agent-src/personas/backend-architect.md +24 -23
- package/dist/agent-src/personas/eloquent-tamer.md +30 -30
- package/dist/agent-src/personas/frontend-engineer.md +30 -30
- package/dist/agent-src/personas/product-owner.md +41 -38
- package/dist/agent-src/personas/qa.md +13 -13
- package/dist/agent-src/personas/security-engineer.md +22 -22
- package/dist/agent-src/presets/README.md +3 -3
- package/dist/agent-src/profiles/README.md +3 -3
- package/dist/agent-src/rules/active-remediation.md +2 -2
- package/dist/agent-src/rules/artifact-engagement-recording.md +4 -4
- package/dist/agent-src/rules/ask-when-uncertain.md +0 -4
- package/dist/agent-src/rules/augment-edit-discipline.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -4
- package/dist/agent-src/rules/code-comment-discipline.md +1 -1
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/commit-policy.md +4 -9
- package/dist/agent-src/rules/communication-through-line.md +5 -5
- package/dist/agent-src/rules/decision-revisit-gate.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +1 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +43 -7
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -3
- package/dist/agent-src/rules/history-discipline.md +1 -1
- package/dist/agent-src/rules/legal-safety-floor.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +5 -5
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +10 -8
- package/dist/agent-src/rules/media-governance-routing.md +13 -13
- package/dist/agent-src/rules/media-sync-ground-truth.md +29 -11
- package/dist/agent-src/rules/no-cheap-questions.md +7 -7
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +29 -18
- package/dist/agent-src/rules/non-destructive-by-default.md +5 -23
- package/dist/agent-src/rules/onboarding-gate.md +14 -4
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/prefer-enums-over-literals.md +9 -9
- package/dist/agent-src/rules/preservation-guard.md +10 -2
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +6 -6
- package/dist/agent-src/rules/rule-type-governance.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +1 -1
- package/dist/agent-src/rules/scope-control.md +1 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +17 -11
- package/dist/agent-src/rules/senior-engineering-discipline.md +17 -17
- package/dist/agent-src/rules/session-canary.md +1 -1
- package/dist/agent-src/rules/skill-quality.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +21 -19
- package/dist/agent-src/rules/source-of-truth.md +6 -5
- package/dist/agent-src/rules/spreadsheet-source-quality.md +2 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/think-before-action.md +5 -5
- package/dist/agent-src/rules/token-budget-discipline.md +5 -3
- package/dist/agent-src/rules/token-efficiency.md +2 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -4
- package/dist/agent-src/rules/user-interaction.md +12 -0
- package/dist/agent-src/rules/verify-before-complete.md +4 -24
- package/dist/agent-src/skills/adversarial-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agent-security-review/SKILL.md +52 -45
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +20 -20
- package/dist/agent-src/skills/ai-council/SKILL.md +185 -128
- package/dist/agent-src/skills/analysis-skill-router/SKILL.md +3 -3
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/artisan-commands/SKILL.md +2 -2
- package/dist/agent-src/skills/async-python-patterns/SKILL.md +8 -7
- package/dist/agent-src/skills/authz-review/SKILL.md +16 -15
- package/dist/agent-src/skills/aws-infrastructure/SKILL.md +5 -5
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +30 -12
- package/dist/agent-src/skills/code-intelligence/SKILL.md +0 -1
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +52 -0
- package/dist/agent-src/skills/code-review/SKILL.md +6 -6
- package/dist/agent-src/skills/command-routing/SKILL.md +5 -4
- package/dist/agent-src/skills/composer-packages/SKILL.md +2 -2
- package/dist/agent-src/skills/condense-memory/SKILL.md +43 -41
- package/dist/agent-src/skills/context-document/SKILL.md +23 -21
- package/dist/agent-src/skills/copilot-config/SKILL.md +6 -1
- package/dist/agent-src/skills/decision-record/SKILL.md +20 -18
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-review/SKILL.md +15 -14
- package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +28 -25
- package/dist/agent-src/skills/devcontainer/SKILL.md +2 -2
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +52 -0
- package/dist/agent-src/skills/emit-tickets/SKILL.md +2 -2
- package/dist/agent-src/skills/error-handling-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/evaluate-llm-feature/SKILL.md +0 -1
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +52 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +21 -7
- package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
- package/dist/agent-src/skills/feature-planning/SKILL.md +2 -2
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +3 -3
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +13 -13
- package/dist/agent-src/skills/git-workflow/SKILL.md +33 -33
- package/dist/agent-src/skills/grafana/SKILL.md +5 -0
- package/dist/agent-src/skills/humanizer/SKILL.md +83 -66
- package/dist/agent-src/skills/humanizer/data/patterns.md +14 -14
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +4 -4
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +82 -37
- package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +17 -5
- package/dist/agent-src/skills/judge-injection-defense/SKILL.md +63 -25
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -0
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +72 -28
- package/dist/agent-src/skills/laravel-horizon/SKILL.md +5 -0
- package/dist/agent-src/skills/laravel-mail/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-middleware/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-notifications/SKILL.md +10 -9
- package/dist/agent-src/skills/laravel-pennant/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-pulse/SKILL.md +9 -8
- package/dist/agent-src/skills/laravel-reverb/SKILL.md +6 -5
- package/dist/agent-src/skills/laravel-scheduling/SKILL.md +6 -1
- package/dist/agent-src/skills/laravel-validation/SKILL.md +12 -0
- package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +7 -7
- package/dist/agent-src/skills/learning-tutor/SKILL.md +44 -43
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-audit/SKILL.md +7 -7
- package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +3 -3
- package/dist/agent-src/skills/license-compliance-credits/SKILL.md +4 -4
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +0 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +69 -64
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -6
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +52 -0
- package/dist/agent-src/skills/performance-analysis/SKILL.md +7 -3
- package/dist/agent-src/skills/persona-improvement/SKILL.md +0 -2
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +52 -0
- package/dist/agent-src/skills/php-coder/SKILL.md +10 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +129 -120
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +36 -35
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +45 -41
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +4 -4
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +3 -3
- package/dist/agent-src/skills/project-analysis-react/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-symfony/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-zend-laminas/SKILL.md +2 -2
- package/dist/agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-validator/SKILL.md +39 -39
- package/dist/agent-src/skills/quality-tools/SKILL.md +15 -15
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +55 -19
- package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +29 -27
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +2 -2
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +25 -25
- package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -5
- package/dist/agent-src/skills/refine-prompt/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +20 -2
- package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +80 -66
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +84 -77
- package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +52 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +26 -9
- package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +38 -16
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +14 -11
- package/dist/agent-src/skills/skill-writing/SKILL.md +9 -8
- package/dist/agent-src/skills/song-to-script/SKILL.md +93 -85
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +4 -3
- package/dist/agent-src/skills/standards-from-config/SKILL.md +61 -43
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +22 -8
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +28 -2
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +13 -13
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +22 -21
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/technical-specification/SKILL.md +5 -0
- package/dist/agent-src/skills/terraform/SKILL.md +2 -2
- package/dist/agent-src/skills/terragrunt/SKILL.md +8 -8
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +19 -13
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +0 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +9 -9
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -1
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +4 -6
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +67 -61
- package/dist/agent-src/skills/video-director/SKILL.md +7 -7
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +3 -3
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +47 -45
- package/dist/agent-src/templates/contexts/lesson-card.md +2 -2
- package/dist/agent-src/templates/contexts/tenant-boundaries.md +2 -2
- package/dist/agent-src/templates/contexts.md +1 -1
- package/dist/agent-src/templates/features.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +125 -116
- package/dist/agent-src/templates/rule.md +2 -1
- package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/dist/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/dist/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
- package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/dist/agent-src/user-types/README.md +8 -8
- package/dist/agent-src/user-types/galabau-field-crew.md +34 -33
- package/dist/agent-src/user-types/metalworking-shop.md +35 -34
- package/dist/agent-src/user-types/truck-driver.md +22 -20
- package/dist/cli/initRouting.js +74 -11
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/main.js +14 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/python/workspace_roles.js +2 -2
- package/dist/cli/python/workspace_roles.js.map +1 -1
- package/dist/cli-delegate/chunk-4SV3XGFA.js +6910 -0
- package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
- package/dist/cli-delegate/chunk-7DSAMZFU.js +356 -0
- package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
- package/dist/cli-delegate/chunk-BJGXZNPM.js +266 -0
- package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
- package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
- package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
- package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
- package/dist/cli-delegate/chunk-IR7P7JWA.js +872 -0
- package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
- package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
- package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
- package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
- package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
- package/dist/cli-delegate/chunk-RDGRHAAB.js +259 -0
- package/dist/cli-delegate/chunk-TFG57JJM.js +1969 -0
- package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
- package/dist/cli-delegate/chunk-YMFO6FDN.js +10603 -0
- package/dist/cli-delegate/cmd_analyze_session.js +294 -0
- package/dist/cli-delegate/cmd_conformance.js +646 -0
- package/dist/cli-delegate/cmd_converge.js +326 -0
- package/dist/cli-delegate/cmd_doctor.js +144 -0
- package/dist/cli-delegate/cmd_explain.js +2508 -0
- package/dist/cli-delegate/cmd_export.js +296 -0
- package/dist/cli-delegate/cmd_fleet.js +332 -0
- package/dist/cli-delegate/cmd_memory_get.js +3878 -0
- package/dist/cli-delegate/cmd_migrate.js +11 -0
- package/dist/cli-delegate/cmd_preflight.js +270 -0
- package/dist/cli-delegate/cmd_prune.js +444 -0
- package/dist/cli-delegate/cmd_refresh.js +28 -0
- package/dist/cli-delegate/cmd_settings_check.js +574 -0
- package/dist/cli-delegate/cmd_settings_migrate.js +223 -0
- package/dist/cli-delegate/cmd_sync.js +264 -0
- package/dist/cli-delegate/cmd_uninstall.js +656 -0
- package/dist/cli-delegate/cmd_update.js +425 -0
- package/dist/cli-delegate/cmd_upgrade.js +444 -0
- package/dist/cli-delegate/cmd_validate.js +305 -0
- package/dist/cli-delegate/cmd_versions.js +370 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +100 -67
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +16 -10
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +7 -5
- package/dist/hooks/dispatch.js +186 -12
- package/dist/install/emit_host_rules_cli.js +2 -1
- package/dist/install/emit_host_rules_cli.js.map +1 -1
- package/dist/install/install.mjs +418 -378
- package/dist/install/rule_scope.js +5 -1
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/toolDetection.js +40 -12
- package/dist/install/toolDetection.js.map +1 -1
- package/dist/install/wizard-plan.js +2 -2
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2194 -1003
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/compile_time_toggles.js +48 -0
- package/dist/scripts/_lib/compile_time_toggles.js.map +1 -0
- package/dist/scripts/condense.js +234 -217
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/shared/userMd/utils.js +30 -0
- package/dist/shared/userMd/utils.js.map +1 -1
- package/dist/ui/assets/index-BpSQt5vm.js.map +1 -1
- package/docs/guidelines/agent-infra/api-cost-levers.md +56 -5
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +93 -33
- package/package.json +4 -2
- package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/src/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
- package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
- package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/src/config/agent-settings.template.yml +32 -2
- package/src/config/ci-local-parity.yml +142 -0
- package/src/config/discovery/packs.yml +7 -0
- package/src/config/evaluator-budgets.json +1 -1
- package/src/config/gate-coverage.yml +127 -0
- package/src/config/pack-size-budget.json +27 -0
- package/src/config/preamble-payload-budget.json +44 -0
- package/src/install/emit_host_rules_cli.ts +2 -1
- package/src/install/rule_scope.ts +5 -1
- package/src/install/toolDetection.ts +39 -8
- package/src/install/wizard-plan.ts +2 -2
- package/src/scripts/_cli/cmd_conformance.ts +2 -1
- package/src/scripts/_cli/cmd_converge.ts +2 -1
- package/src/scripts/_cli/cmd_doctor.ts +292 -15
- package/src/scripts/_cli/cmd_export.ts +2 -1
- package/src/scripts/_cli/cmd_fleet.ts +2 -1
- package/src/scripts/_cli/cmd_migrate.ts +2 -1
- package/src/scripts/_cli/cmd_preflight.ts +2 -1
- package/src/scripts/_cli/cmd_refresh.ts +2 -1
- package/src/scripts/_cli/cmd_update.ts +2 -1
- package/src/scripts/_cli/cmd_upgrade.ts +2 -1
- package/src/scripts/_cli/cmd_versions.ts +2 -1
- package/src/scripts/_cli/detection_report.ts +480 -0
- package/src/scripts/_dispatch.bash +52 -14
- package/src/scripts/_lib/agent_user_profile.ts +381 -0
- package/src/scripts/_lib/agents_overlay.ts +9 -0
- package/src/scripts/_lib/anchor_eval.ts +311 -0
- package/src/scripts/_lib/cc_transcript.ts +316 -0
- package/src/scripts/_lib/changelog_eras.ts +103 -9
- package/src/scripts/_lib/compile_time_toggles.ts +79 -0
- package/src/scripts/_lib/confusables.ts +101 -0
- package/src/scripts/_lib/duplicate_scope_census.ts +77 -0
- package/src/scripts/_lib/environment_detector.ts +441 -0
- package/src/scripts/_lib/managed_agents_folder.ts +181 -0
- package/src/scripts/_lib/package_root.ts +72 -0
- package/src/scripts/_lib/payload_hash_drift.ts +126 -0
- package/src/scripts/_lib/preservation_migration.ts +291 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +166 -2
- package/src/scripts/_lib/scan_scope.ts +115 -0
- package/src/scripts/_lib/user_global_memory_audit.ts +187 -0
- package/src/scripts/_lib/user_global_observations.ts +830 -0
- package/src/scripts/_lib/user_global_revocations.ts +110 -0
- package/src/scripts/_lib/user_memory_gate_counters.ts +291 -0
- package/src/scripts/ai_council/blind_review.ts +0 -0
- package/src/scripts/ai_council/budget_guard.ts +90 -11
- package/src/scripts/ai_council/bundler.ts +2 -2
- package/src/scripts/ai_council/clients.ts +59 -3
- package/src/scripts/ai_council/config.ts +53 -7
- package/src/scripts/ai_council/modes.ts +68 -2
- package/src/scripts/ai_council/orchestrator.ts +54 -9
- package/src/scripts/ai_council/transport_resolver.ts +331 -0
- package/src/scripts/ai_team/team_dispatch.ts +17 -6
- package/src/scripts/anchor_eval_falsify.ts +198 -0
- package/src/scripts/anchor_scoring_run.ts +239 -0
- package/src/scripts/annotate_discovery.ts +1 -65
- package/src/scripts/bench_quality_run.ts +168 -4
- package/src/scripts/cache_realization_report.ts +782 -0
- package/src/scripts/check_artefact_count_messaging.ts +5 -1
- package/src/scripts/check_augment_description_cap.ts +15 -4
- package/src/scripts/check_bundle_path_leakage.ts +10 -4
- package/src/scripts/check_ci_local_parity.ts +317 -0
- package/src/scripts/check_condensation.ts +96 -191
- package/src/scripts/check_context_paths.ts +38 -9
- package/src/scripts/check_dependency_floors.ts +153 -0
- package/src/scripts/check_gate_coverage.ts +299 -0
- package/src/scripts/check_iron_law_prominence.ts +22 -1
- package/src/scripts/check_kernel_prefix_stability.ts +0 -0
- package/src/scripts/check_no_new_legacy_path.ts +16 -6
- package/src/scripts/check_no_roadmap_refs.ts +22 -9
- package/src/scripts/check_originality_freshness.ts +167 -0
- package/src/scripts/check_pack_size.ts +188 -0
- package/src/scripts/check_preamble_payload_budget.ts +130 -0
- package/src/scripts/check_proposal.ts +0 -0
- package/src/scripts/check_references.ts +0 -1
- package/src/scripts/check_safety_floor_untouched.ts +171 -24
- package/src/scripts/check_site_links.ts +62 -3
- package/src/scripts/ci_status.ts +0 -0
- package/src/scripts/cluster_near_miss_patterns.ts +0 -0
- package/src/scripts/code_graph/build.ts +0 -0
- package/src/scripts/command_suggester/types.ts +0 -0
- package/src/scripts/compile_router.ts +10 -14
- package/src/scripts/condense.sh +3 -4
- package/src/scripts/condense.ts +247 -228
- package/src/scripts/cost/track.mjs +168 -33
- package/src/scripts/cost_summary.ts +33 -1
- package/src/scripts/council_cli.ts +51 -5
- package/src/scripts/discovery_graph.ts +0 -0
- package/src/scripts/encoding_corpus.ts +500 -0
- package/src/scripts/encoding_corpus_report.ts +216 -0
- package/src/scripts/evaluator_umbrella.sh +34 -1
- package/src/scripts/generate_index.ts +19 -2
- package/src/scripts/install-hooks.sh +2 -2
- package/src/scripts/learning_sidecar.ts +0 -0
- package/src/scripts/lint_confusables.ts +10 -72
- package/src/scripts/lint_eval_fixture_citations.ts +113 -0
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_hidden_unicode.ts +208 -0
- package/src/scripts/lint_load_context.ts +17 -5
- package/src/scripts/lint_new_skill_gate.ts +9 -3
- package/src/scripts/lint_no_python_twin_rationale.ts +17 -2
- package/src/scripts/lint_originality.ts +1 -1
- package/src/scripts/lint_skill_originality.ts +1 -1
- package/src/scripts/lint_ticket_buildable.ts +1 -1
- package/src/scripts/lint_ui_stack_bundles.ts +170 -0
- package/src/scripts/mcp_server/tools.ts +4 -4
- package/src/scripts/measure_scope_dedup.ts +224 -0
- package/src/scripts/memory_lookup.ts +0 -0
- package/src/scripts/mine_session.ts +98 -0
- package/src/scripts/orchestration_payload_hash_drift.ts +145 -0
- package/src/scripts/preamble_byte_census.ts +574 -0
- package/src/scripts/probe_skill_registration.ts +2 -2
- package/src/scripts/redact_hook_capture.ts +13 -0
- package/src/scripts/release.ts +65 -10
- package/src/scripts/router_telemetry.ts +1 -1
- package/src/scripts/second_brain_retrieval.ts +14 -4
- package/src/scripts/skill_linter.ts +5 -0
- package/src/scripts/surface-tiers.yml +2 -0
- package/src/scripts/validate_pack_yaml.ts +0 -0
- package/src/server/schemas/settings.ts +8 -0
- package/src/shared/userMd/utils.ts +31 -0
- package/dist/agent-src/rules/telegraph-speak.md +0 -87
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Measure the encoding floor against the FROZEN corpus
|
|
4
|
+
* (road-to-runtime-encoding-hardening Phase 4).
|
|
5
|
+
*
|
|
6
|
+
* Renders the numbers from the corpus — never hand-typed — and evaluates them
|
|
7
|
+
* against the thresholds the roadmap pre-registered BEFORE the detector existed:
|
|
8
|
+
*
|
|
9
|
+
* recall on in-scope positives >= 0.95
|
|
10
|
+
* recall on unambiguous classes >= 0.99
|
|
11
|
+
* (zero-width, bidi, variation-selector)
|
|
12
|
+
* false-positive rate on clean negatives <= 0.005
|
|
13
|
+
* added runtime model spend == 0 (structural: no model call)
|
|
14
|
+
* added latency < 2 ms p95 per message
|
|
15
|
+
*
|
|
16
|
+
* A positive counts as DETECTED when the floor either strips its signal
|
|
17
|
+
* (`sanitize_text` changed the value) or reports it (`scan_encoding_findings`
|
|
18
|
+
* returned a finding). Both are "the vector did not reach the model unnoticed",
|
|
19
|
+
* which is the property under test.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* encoding_corpus_report # human summary + exit 1 if a gate fails
|
|
23
|
+
* encoding_corpus_report --json # machine payload
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from 'node:fs';
|
|
26
|
+
import * as path from 'node:path';
|
|
27
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
28
|
+
|
|
29
|
+
import { OUT_DIR, type CorpusEntry } from './encoding_corpus.js';
|
|
30
|
+
import { sanitize_text, scan_encoding_findings } from './_lib/retrieval_sanitize.js';
|
|
31
|
+
|
|
32
|
+
/** Pre-registered acceptance thresholds — do not edit to make a run pass. */
|
|
33
|
+
export const THRESHOLDS = {
|
|
34
|
+
recall_all: 0.95,
|
|
35
|
+
recall_unambiguous: 0.99,
|
|
36
|
+
fp_rate_max: 0.005,
|
|
37
|
+
latency_p95_ms_max: 2,
|
|
38
|
+
} as const;
|
|
39
|
+
|
|
40
|
+
/** Classes the roadmap singled out as unambiguous → higher recall bar. */
|
|
41
|
+
export const UNAMBIGUOUS_CHANNELS: readonly string[] = [
|
|
42
|
+
'zero-width',
|
|
43
|
+
'zero-width-joiner-bom',
|
|
44
|
+
'bidi-control',
|
|
45
|
+
'variation-selector-run',
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
function _readJsonl(name: string): CorpusEntry[] {
|
|
49
|
+
return fs
|
|
50
|
+
.readFileSync(path.join(OUT_DIR, name), 'utf-8')
|
|
51
|
+
.split('\n')
|
|
52
|
+
.filter((l) => l !== '')
|
|
53
|
+
.map((l) => JSON.parse(l) as CorpusEntry);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** True when the floor either stripped or reported the entry's signal. */
|
|
57
|
+
export function detected(text: string): { hit: boolean; stripped: boolean; flagged: boolean } {
|
|
58
|
+
const stripped = sanitize_text(text) !== text;
|
|
59
|
+
const flagged = scan_encoding_findings(text).length > 0;
|
|
60
|
+
return { hit: stripped || flagged, stripped, flagged };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface Report {
|
|
64
|
+
readonly corpus: { positives: number; negatives: number };
|
|
65
|
+
readonly recall_all: number;
|
|
66
|
+
readonly recall_unambiguous: number;
|
|
67
|
+
readonly fp_rate: number;
|
|
68
|
+
readonly per_channel: Record<string, { n: number; detected: number; recall: number }>;
|
|
69
|
+
readonly false_positives: readonly string[];
|
|
70
|
+
readonly latency_p95_ms: number;
|
|
71
|
+
readonly model_calls: 0;
|
|
72
|
+
readonly gates: Record<string, { value: number; threshold: number; pass: boolean }>;
|
|
73
|
+
readonly verdict: 'ADOPT' | 'DETECT-AND-FLAG-ONLY' | 'FAIL';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function _p95(samples: readonly number[]): number {
|
|
77
|
+
const sorted = [...samples].sort((a, b) => a - b);
|
|
78
|
+
const idx = Math.min(sorted.length - 1, Math.floor(sorted.length * 0.95));
|
|
79
|
+
return sorted[idx] ?? 0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function measure(): Report {
|
|
83
|
+
const positives = _readJsonl('positives.jsonl');
|
|
84
|
+
const negatives = _readJsonl('negatives.jsonl');
|
|
85
|
+
|
|
86
|
+
const perChannel: Record<string, { n: number; detected: number; recall: number }> = {};
|
|
87
|
+
const latencies: number[] = [];
|
|
88
|
+
let hits = 0;
|
|
89
|
+
for (const e of positives) {
|
|
90
|
+
const t0 = process.hrtime.bigint();
|
|
91
|
+
const d = detected(e.text);
|
|
92
|
+
latencies.push(Number(process.hrtime.bigint() - t0) / 1e6);
|
|
93
|
+
const slot = perChannel[e.channel] ?? { n: 0, detected: 0, recall: 0 };
|
|
94
|
+
slot.n += 1;
|
|
95
|
+
if (d.hit) {
|
|
96
|
+
slot.detected += 1;
|
|
97
|
+
hits += 1;
|
|
98
|
+
}
|
|
99
|
+
slot.recall = slot.detected / slot.n;
|
|
100
|
+
perChannel[e.channel] = slot;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const falsePositives: string[] = [];
|
|
104
|
+
for (const e of negatives) {
|
|
105
|
+
const t0 = process.hrtime.bigint();
|
|
106
|
+
const d = detected(e.text);
|
|
107
|
+
latencies.push(Number(process.hrtime.bigint() - t0) / 1e6);
|
|
108
|
+
if (d.hit) falsePositives.push(`${e.id}: ${e.text.slice(0, 90)}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const unambiguous = positives.filter((e) => UNAMBIGUOUS_CHANNELS.includes(e.channel));
|
|
112
|
+
const unambiguousHits = unambiguous.filter((e) => detected(e.text).hit).length;
|
|
113
|
+
|
|
114
|
+
const recallAll = positives.length === 0 ? 0 : hits / positives.length;
|
|
115
|
+
const recallUnambiguous = unambiguous.length === 0 ? 0 : unambiguousHits / unambiguous.length;
|
|
116
|
+
const fpRate = negatives.length === 0 ? 0 : falsePositives.length / negatives.length;
|
|
117
|
+
const p95 = _p95(latencies);
|
|
118
|
+
|
|
119
|
+
const gates = {
|
|
120
|
+
recall_all: { value: recallAll, threshold: THRESHOLDS.recall_all, pass: recallAll >= THRESHOLDS.recall_all },
|
|
121
|
+
recall_unambiguous: {
|
|
122
|
+
value: recallUnambiguous,
|
|
123
|
+
threshold: THRESHOLDS.recall_unambiguous,
|
|
124
|
+
pass: recallUnambiguous >= THRESHOLDS.recall_unambiguous,
|
|
125
|
+
},
|
|
126
|
+
fp_rate: { value: fpRate, threshold: THRESHOLDS.fp_rate_max, pass: fpRate <= THRESHOLDS.fp_rate_max },
|
|
127
|
+
latency_p95_ms: {
|
|
128
|
+
value: p95,
|
|
129
|
+
threshold: THRESHOLDS.latency_p95_ms_max,
|
|
130
|
+
pass: p95 < THRESHOLDS.latency_p95_ms_max,
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// The roadmap's pre-registered branch: recall clears but FP is over budget →
|
|
135
|
+
// ship detect-and-flag only, never automatic quarantine, and publish the FP
|
|
136
|
+
// number. Nothing here quarantines anyway, so this records which branch the
|
|
137
|
+
// measurement selected rather than switching behaviour after the fact.
|
|
138
|
+
const recallOk = gates.recall_all.pass && gates.recall_unambiguous.pass;
|
|
139
|
+
const verdict: Report['verdict'] = !recallOk
|
|
140
|
+
? 'FAIL'
|
|
141
|
+
: gates.fp_rate.pass && gates.latency_p95_ms.pass
|
|
142
|
+
? 'ADOPT'
|
|
143
|
+
: 'DETECT-AND-FLAG-ONLY';
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
corpus: { positives: positives.length, negatives: negatives.length },
|
|
147
|
+
recall_all: recallAll,
|
|
148
|
+
recall_unambiguous: recallUnambiguous,
|
|
149
|
+
fp_rate: fpRate,
|
|
150
|
+
per_channel: perChannel,
|
|
151
|
+
false_positives: falsePositives,
|
|
152
|
+
latency_p95_ms: p95,
|
|
153
|
+
model_calls: 0,
|
|
154
|
+
gates,
|
|
155
|
+
verdict,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function _render(r: Report): string {
|
|
160
|
+
const pct = (n: number): string => (n * 100).toFixed(2) + '%';
|
|
161
|
+
const lines: string[] = [];
|
|
162
|
+
lines.push(`corpus: ${r.corpus.positives} positives · ${r.corpus.negatives} negatives`);
|
|
163
|
+
lines.push('');
|
|
164
|
+
lines.push('per-channel recall');
|
|
165
|
+
for (const [ch, s] of Object.entries(r.per_channel).sort()) {
|
|
166
|
+
const mark = s.recall === 1 ? ' ' : '!!';
|
|
167
|
+
lines.push(` ${mark} ${ch.padEnd(24)} ${s.detected}/${s.n} ${pct(s.recall)}`);
|
|
168
|
+
}
|
|
169
|
+
lines.push('');
|
|
170
|
+
for (const [name, g] of Object.entries(r.gates)) {
|
|
171
|
+
const cmp = name === 'fp_rate' || name === 'latency_p95_ms' ? '<=' : '>=';
|
|
172
|
+
const val = name === 'latency_p95_ms' ? `${g.value.toFixed(3)} ms` : pct(g.value);
|
|
173
|
+
const thr = name === 'latency_p95_ms' ? `${g.threshold} ms` : pct(g.threshold);
|
|
174
|
+
lines.push(` ${g.pass ? 'PASS' : 'FAIL'} ${name.padEnd(20)} ${val} ${cmp} ${thr}`);
|
|
175
|
+
}
|
|
176
|
+
lines.push(` PASS ${'model_calls'.padEnd(20)} 0 (structural: no model call on this path)`);
|
|
177
|
+
if (r.false_positives.length > 0) {
|
|
178
|
+
lines.push('');
|
|
179
|
+
lines.push(`false positives (${r.false_positives.length}):`);
|
|
180
|
+
for (const fp of r.false_positives.slice(0, 12)) lines.push(` - ${fp}`);
|
|
181
|
+
if (r.false_positives.length > 12) {
|
|
182
|
+
lines.push(` … ${r.false_positives.length - 12} more`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
lines.push('');
|
|
186
|
+
lines.push(`verdict: ${r.verdict}`);
|
|
187
|
+
return lines.join('\n') + '\n';
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function main(argv: readonly string[] | null = null): number {
|
|
191
|
+
const args = argv ?? process.argv.slice(2);
|
|
192
|
+
const r = measure();
|
|
193
|
+
if (args.includes('--json')) {
|
|
194
|
+
process.stdout.write(JSON.stringify(r, null, 2) + '\n');
|
|
195
|
+
} else {
|
|
196
|
+
process.stdout.write(_render(r));
|
|
197
|
+
}
|
|
198
|
+
return r.verdict === 'FAIL' ? 1 : 0;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
202
|
+
function _isCliEntry(): boolean {
|
|
203
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) return false;
|
|
204
|
+
if (process.argv[1] === undefined) return false;
|
|
205
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
206
|
+
if (import.meta.url === argvUrl) return true;
|
|
207
|
+
try {
|
|
208
|
+
return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
|
|
209
|
+
} catch {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (_isCliEntry()) {
|
|
215
|
+
process.exitCode = main();
|
|
216
|
+
}
|
|
@@ -65,11 +65,38 @@ UNPACKED_BYTES="$(npm pack --dry-run --json --ignore-scripts --silent 2>/dev/nul
|
|
|
65
65
|
step "headless consumer install from the tarball"
|
|
66
66
|
WORK="$(mktemp -d)"
|
|
67
67
|
trap 'rm -rf "$WORK"' EXIT
|
|
68
|
+
COLD_START_T0="$(node -e 'console.log(Date.now())')"
|
|
68
69
|
( cd "$WORK" && npm init -y >/dev/null 2>&1 \
|
|
69
70
|
&& npm install --omit=dev --no-audit --no-fund --silent "$ROOT/$TARBALL" )
|
|
70
71
|
PKG_DIR="$WORK/node_modules/@event4u/agent-config"
|
|
71
72
|
[[ -d "$PKG_DIR" ]] || { echo "❌ install did not produce the package dir" >&2; exit 1; }
|
|
72
73
|
|
|
74
|
+
# ------------------------------------------- 3b. cold start: install → doctor
|
|
75
|
+
# The bare-machine wall-clock a first-time user lives through, measured end to
|
|
76
|
+
# end from `npm install` to `doctor` having run. This is EVIDENCE, never a
|
|
77
|
+
# promise, and deliberately NOT a budget entry: it is dominated by network and
|
|
78
|
+
# registry latency, which are not ours to guarantee. A gate on it would flap on
|
|
79
|
+
# runner weather and teach the reader to ignore the line
|
|
80
|
+
# (road-to-zero-ceremony-install Phase 6).
|
|
81
|
+
step "cold start: install → doctor (evidence, not a gate)"
|
|
82
|
+
COLD_START_MS="$(node -e '
|
|
83
|
+
const {execFileSync}=require("node:child_process");
|
|
84
|
+
const [bin, t0] = process.argv.slice(1);
|
|
85
|
+
try { execFileSync(bin, ["doctor"], {stdio:"ignore"}); }
|
|
86
|
+
catch { /* doctor may report findings; the run still bounds the wall-clock */ }
|
|
87
|
+
console.log(Date.now() - Number(t0));' "$WORK/node_modules/.bin/agent-config" "$COLD_START_T0")"
|
|
88
|
+
COLD_START_CONDITIONS="$(uname -s)/$(uname -m) · node $(node --version) · npm $(npm --version) · npm install --omit=dev from a LOCAL tarball (no registry round-trip for the package itself; a real first-touch install adds registry latency)"
|
|
89
|
+
printf 'cold_start_install_to_doctor_ms=%s\n' "$COLD_START_MS"
|
|
90
|
+
printf 'cold_start_conditions=%s\n' "$COLD_START_CONDITIONS"
|
|
91
|
+
if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then
|
|
92
|
+
{
|
|
93
|
+
printf '### Cold start — install → doctor\n\n'
|
|
94
|
+
printf '**%s ms**\n\n' "$COLD_START_MS"
|
|
95
|
+
printf 'Conditions: %s\n\n' "$COLD_START_CONDITIONS"
|
|
96
|
+
printf 'Evidence, not a promise — no shipped claim states this as a guarantee.\n'
|
|
97
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
98
|
+
fi
|
|
99
|
+
|
|
73
100
|
# --------------------------------------------------------- 4. staleness lints
|
|
74
101
|
step "staleness lints (pre-migration refs)"
|
|
75
102
|
./scripts-run src/scripts/lint_pre_migration_refs
|
|
@@ -128,10 +155,16 @@ const m={
|
|
|
128
155
|
mcp_boot_to_initialize_ms: Number(process.argv[6]),
|
|
129
156
|
cli_help_command_count: Number(process.argv[7]),
|
|
130
157
|
mcp_public_tool_count: Number(process.argv[8]),
|
|
158
|
+
// Evidence-only: carried in the artifact with its conditions, never gated.
|
|
159
|
+
// check_evaluator_budgets iterates the BUDGET entries, so an extra
|
|
160
|
+
// measurement is recorded and ignored by the gate — by design.
|
|
161
|
+
cold_start_install_to_doctor_ms: Number(process.argv[9]),
|
|
162
|
+
cold_start_conditions: process.argv[10],
|
|
131
163
|
};
|
|
132
164
|
fs.writeFileSync(process.argv[1], JSON.stringify(m, null, 2));
|
|
133
165
|
console.log(JSON.stringify(m, null, 1));' \
|
|
134
|
-
"$MEASURE_TMP" "$UNPACKED_BYTES" "$NM_MB" "$DEP_COUNT" "$CLI_MS" "$MCP_MS" "$CLI_COUNT" "$MCP_TOOLS"
|
|
166
|
+
"$MEASURE_TMP" "$UNPACKED_BYTES" "$NM_MB" "$DEP_COUNT" "$CLI_MS" "$MCP_MS" "$CLI_COUNT" "$MCP_TOOLS" \
|
|
167
|
+
"$COLD_START_MS" "$COLD_START_CONDITIONS"
|
|
135
168
|
|
|
136
169
|
step "budget gate (absolute + >regression_pct creep)"
|
|
137
170
|
./scripts-run src/scripts/check_evaluator_budgets --measurements "$MEASURE_TMP"
|
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
strip_source_prefix,
|
|
26
26
|
} from './_lib/agent_src.js';
|
|
27
27
|
import { computeStatus as domainSoundnessStatus } from './domain_soundness_status.js';
|
|
28
|
+
import { skip_compile_disabled_rule } from './condense.js';
|
|
28
29
|
|
|
29
30
|
const _HERE = fileURLToPath(import.meta.url);
|
|
30
31
|
|
|
@@ -243,6 +244,12 @@ export function _collect_skills(): Entry[] {
|
|
|
243
244
|
return _sortedKeys(seen).map((k) => seen.get(k) as Entry);
|
|
244
245
|
}
|
|
245
246
|
|
|
247
|
+
// docs/catalog.md is a SHIPPED file, so a relative link from it must resolve inside
|
|
248
|
+
// package.json#files. docs/proof.md is not shipped and cannot be: it is 58KB of
|
|
249
|
+
// generated output linking eight paths under internal/bench/, tests/ and src/scripts/
|
|
250
|
+
// that are themselves unshipped, so shipping it would hand consumers a page of dead
|
|
251
|
+
// links. The published site URL is the honest target for a consumer-facing pointer.
|
|
252
|
+
|
|
246
253
|
export function _collect_rules(): Entry[] {
|
|
247
254
|
const seen = new Map<string, Entry>();
|
|
248
255
|
for (const srcRoot of artefact_roots()) {
|
|
@@ -255,6 +262,14 @@ export function _collect_rules(): Entry[] {
|
|
|
255
262
|
if (seen.has(stem)) {
|
|
256
263
|
continue;
|
|
257
264
|
}
|
|
265
|
+
// A compile-disabled rule has no dist/agent-src/ counterpart, and the
|
|
266
|
+
// table links the SHIPPED path — so listing it emits a dead link. The
|
|
267
|
+
// toggle is a separate axis from the source file's existence; this is its
|
|
268
|
+
// fifth consumer after the router compiler, the dist writer, check_sync,
|
|
269
|
+
// and the per-tool symlink generator. Same predicate in all five.
|
|
270
|
+
if (skip_compile_disabled_rule(`rules/${stem}.md`)) {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
258
273
|
const fm = _parse_frontmatter(fs.readFileSync(ruleMd, 'utf-8'));
|
|
259
274
|
seen.set(stem, {
|
|
260
275
|
kind: 'rule',
|
|
@@ -420,7 +435,8 @@ export function _render_catalog(
|
|
|
420
435
|
'> not yet. Coverage is reported per tier (`./scripts-run',
|
|
421
436
|
'> src/scripts/skill_eval_coverage`) and CI-ratcheted so it can only rise.',
|
|
422
437
|
'> Listing here never implies a skill is behaviourally tested — the',
|
|
423
|
-
'> current coverage and its gap are published on [the proof page]
|
|
438
|
+
'> current coverage and its gap are published on [the proof page]' +
|
|
439
|
+
'(https://event4u-app.github.io/agent-config/proof/).',
|
|
424
440
|
'',
|
|
425
441
|
'> **Non-coding domain correctness is scoped, not proven.** The',
|
|
426
442
|
'> `finance` / `founder` / `ops` / `content` skills are forged on TS/PHP',
|
|
@@ -429,7 +445,8 @@ export function _render_catalog(
|
|
|
429
445
|
'> cited formulas, or rubric targets matching a named external practice);',
|
|
430
446
|
'> the rest are labeled `unvalidated` until they pass one',
|
|
431
447
|
'> (`./scripts-run src/scripts/domain_soundness_status`). A disclaimer',
|
|
432
|
-
'> floor bounds liability, not correctness — see [the proof page]
|
|
448
|
+
'> floor bounds liability, not correctness — see [the proof page]' +
|
|
449
|
+
'(https://event4u-app.github.io/agent-config/proof/).',
|
|
433
450
|
'',
|
|
434
451
|
_render_table(skills, ['kind', 'name', 'source', 'description'], '../', _to_shipped_path),
|
|
435
452
|
'',
|
|
@@ -30,8 +30,8 @@ cat > "$HOOKS_DIR/pre-push" << 'EOF'
|
|
|
30
30
|
# the old hook only verified dist sync + the COMMAND count — it missed
|
|
31
31
|
# guideline/skill/rule count drift and the generate-tools / router / corpus
|
|
32
32
|
# outputs (e.g. a new guideline bumping the count in README + docs/architecture).
|
|
33
|
-
# `task consistency` is the EXACT CI mirror (sync-check + sync
|
|
34
|
-
#
|
|
33
|
+
# `task consistency` is the EXACT CI mirror (sync-check + sync + generate-tools
|
|
34
|
+
# + compile-router + compile-corpus + `git diff --quiet`),
|
|
35
35
|
# so any derived-output drift blocks the push here. Runtime ~15-40s (it
|
|
36
36
|
# regenerates the tool trees) — cheaper than a red CI run and a fixup re-push.
|
|
37
37
|
|
|
Binary file
|
|
@@ -34,86 +34,24 @@ import * as fs from 'node:fs';
|
|
|
34
34
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
35
35
|
|
|
36
36
|
import * as sl from './_lib/security_lint.js';
|
|
37
|
+
import { TOKEN_RE, classifyToken } from './_lib/confusables.js';
|
|
37
38
|
|
|
38
39
|
export const CHECK = 'mixed-script-confusable';
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const _LETTER = /\p{L}/u;
|
|
47
|
-
// A "token" is a maximal run of letters / combining marks / decimal digits.
|
|
48
|
-
const _TOKEN = /[\p{L}\p{M}\p{Nd}]+/gu;
|
|
49
|
-
|
|
50
|
-
// Cyrillic + Greek codepoints that have a basic-Latin lookalike (Unicode TR39
|
|
51
|
-
// confusables, common subset). A foreign letter only counts toward the
|
|
52
|
-
// confusable signal when it is in this set — Greek math operators with no Latin
|
|
53
|
-
// twin (Δ Σ Π Ω Φ Θ Λ Ξ Ψ Γ δ π ω …) are deliberately excluded so legit
|
|
54
|
-
// notation does not false-positive.
|
|
55
|
-
const _CONFUSABLE_FOREIGN: ReadonlySet<number> = new Set([
|
|
56
|
-
// Cyrillic lowercase ↔ Latin
|
|
57
|
-
0x0430 /*а→a*/, 0x0435 /*е→e*/, 0x043e /*о→o*/, 0x0440 /*р→p*/, 0x0441 /*с→c*/,
|
|
58
|
-
0x0443 /*у→y*/, 0x0445 /*х→x*/, 0x0455 /*ѕ→s*/, 0x0456 /*і→i*/, 0x0458 /*ј→j*/,
|
|
59
|
-
0x04bb /*һ→h*/, 0x0501 /*ԁ→d*/, 0x051b /*ԛ→q*/, 0x0577 /*no*/,
|
|
60
|
-
// Cyrillic uppercase ↔ Latin
|
|
61
|
-
0x0410 /*А→A*/, 0x0412 /*В→B*/, 0x0415 /*Е→E*/, 0x041a /*К→K*/, 0x041c /*М→M*/,
|
|
62
|
-
0x041d /*Н→H*/, 0x041e /*О→O*/, 0x0420 /*Р→P*/, 0x0421 /*С→C*/, 0x0422 /*Т→T*/,
|
|
63
|
-
0x0423 /*У→Y*/, 0x0425 /*Х→X*/, 0x0405 /*Ѕ→S*/, 0x0406 /*І→I*/, 0x0408 /*Ј→J*/,
|
|
64
|
-
// Greek lowercase ↔ Latin
|
|
65
|
-
0x03b1 /*α→a*/, 0x03b5 /*ε→e*/, 0x03bf /*ο→o*/, 0x03bd /*ν→v*/, 0x03c1 /*ρ→p*/,
|
|
66
|
-
0x03c5 /*υ→u*/, 0x03c7 /*χ→x*/, 0x03ba /*κ→k*/,
|
|
67
|
-
// Greek uppercase ↔ Latin (only those with a real Latin twin)
|
|
68
|
-
0x0391 /*Α→A*/, 0x0392 /*Β→B*/, 0x0395 /*Ε→E*/, 0x0396 /*Ζ→Z*/, 0x0397 /*Η→H*/,
|
|
69
|
-
0x0399 /*Ι→I*/, 0x039a /*Κ→K*/, 0x039c /*Μ→M*/, 0x039d /*Ν→N*/, 0x039f /*Ο→O*/,
|
|
70
|
-
0x03a1 /*Ρ→P*/, 0x03a4 /*Τ→T*/, 0x03a5 /*Υ→Y*/, 0x03a7 /*Χ→X*/, 0x0392 /*Β→B*/,
|
|
71
|
-
]);
|
|
72
|
-
|
|
73
|
-
type ScriptName = 'latin' | 'cyrillic' | 'greek' | 'other';
|
|
74
|
-
|
|
75
|
-
function _script_of(ch: string): ScriptName {
|
|
76
|
-
if (_LATIN.test(ch)) return 'latin';
|
|
77
|
-
if (_CYRILLIC.test(ch)) return 'cyrillic';
|
|
78
|
-
if (_GREEK.test(ch)) return 'greek';
|
|
79
|
-
return 'other';
|
|
80
|
-
}
|
|
41
|
+
// The confusable table + the mixed-script decision rule live in ONE place so
|
|
42
|
+
// this authoring-time linter and the runtime encoding scanner cannot drift apart
|
|
43
|
+
// (road-to-runtime-encoding-hardening Phase 3). `_classify_token` stays exported
|
|
44
|
+
// under its original name — it is this module's published surface and its tests
|
|
45
|
+
// address it here.
|
|
46
|
+
const _TOKEN = TOKEN_RE;
|
|
81
47
|
|
|
82
48
|
/**
|
|
83
49
|
* Classify a single token. Returns the offending mixed-script descriptor when
|
|
84
50
|
* the token matches the homoglyph signature, else null.
|
|
51
|
+
*
|
|
52
|
+
* Thin re-export of the shared implementation — see `_lib/confusables.ts`.
|
|
85
53
|
*/
|
|
86
|
-
export
|
|
87
|
-
let latin = 0;
|
|
88
|
-
let cyrillic = 0;
|
|
89
|
-
let greek = 0;
|
|
90
|
-
let letters = 0;
|
|
91
|
-
for (const ch of token) {
|
|
92
|
-
if (!_LETTER.test(ch)) continue; // skip combining marks / digits for script vote
|
|
93
|
-
letters += 1;
|
|
94
|
-
const script = _script_of(ch);
|
|
95
|
-
if (script === 'latin') {
|
|
96
|
-
latin += 1;
|
|
97
|
-
} else if (script === 'cyrillic' || script === 'greek') {
|
|
98
|
-
// Only confusable foreign letters (TR39) count — math operators with
|
|
99
|
-
// no Latin twin are ignored, so legit notation never trips.
|
|
100
|
-
if (_CONFUSABLE_FOREIGN.has(ch.codePointAt(0) as number)) {
|
|
101
|
-
if (script === 'cyrillic') cyrillic += 1;
|
|
102
|
-
else greek += 1;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (letters < MIN_LETTERS) return null;
|
|
107
|
-
const foreign = cyrillic + greek;
|
|
108
|
-
if (latin === 0 || foreign === 0) return null; // single-script (or no Latin) → legit
|
|
109
|
-
if (latin <= foreign) return null; // majority must be Latin (foreign word ≠ attack)
|
|
110
|
-
const which = cyrillic > 0 && greek > 0
|
|
111
|
-
? 'cyrillic+greek'
|
|
112
|
-
: cyrillic > 0
|
|
113
|
-
? 'cyrillic'
|
|
114
|
-
: 'greek';
|
|
115
|
-
return `latin+${which} (${latin} latin / ${foreign} foreign-confusable)`;
|
|
116
|
-
}
|
|
54
|
+
export const _classify_token = classifyToken;
|
|
117
55
|
|
|
118
56
|
export function _scan(sf: sl.ScannedFile): sl.Finding[] {
|
|
119
57
|
if (sf.pragma_allows(CHECK)) {
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Every design-artifact eval fixture id must be cited by some surface.
|
|
4
|
+
*
|
|
5
|
+
* The fixtures file used to assert that the lifecycle contract's branch table
|
|
6
|
+
* "references these ids". It cites nine of them; the rest are gated elsewhere
|
|
7
|
+
* (the design-fidelity mechanics guideline, the lane-matrix test) — and a
|
|
8
|
+
* handful were cited by nothing at all. An uncited fixture is an eval nobody
|
|
9
|
+
* runs and no contract depends on, which is exactly the shape of coverage that
|
|
10
|
+
* looks real in a count and is absent in practice.
|
|
11
|
+
*
|
|
12
|
+
* This checks citation, not correctness: an id must appear outside its own
|
|
13
|
+
* definition. Which surface cites it is the author's call.
|
|
14
|
+
*
|
|
15
|
+
* Exit codes: 0 every id cited, 1 one or more uncited.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import * as fs from 'node:fs';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
|
|
22
|
+
const QUIET = process.argv.includes('--quiet');
|
|
23
|
+
|
|
24
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
25
|
+
const REPO = path.resolve(path.dirname(_HERE), '..', '..');
|
|
26
|
+
const FIXTURES = path.join(REPO, 'tests', 'design-artifacts', 'eval-fixtures.md');
|
|
27
|
+
|
|
28
|
+
/** Surfaces allowed to satisfy a citation. */
|
|
29
|
+
const SCAN_ROOTS: readonly string[] = [
|
|
30
|
+
path.join(REPO, 'docs', 'contracts'),
|
|
31
|
+
path.join(REPO, 'docs', 'guidelines'),
|
|
32
|
+
path.join(REPO, 'src', 'skills'),
|
|
33
|
+
path.join(REPO, 'src', 'rules'),
|
|
34
|
+
path.join(REPO, 'tests', 'scripts'),
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
const SCAN_EXTS: ReadonlySet<string> = new Set(['.md', '.ts']);
|
|
38
|
+
|
|
39
|
+
function walk(dir: string, out: string[]): void {
|
|
40
|
+
let entries: fs.Dirent[];
|
|
41
|
+
try {
|
|
42
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
43
|
+
} catch {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
for (const entry of entries) {
|
|
47
|
+
const p = path.join(dir, entry.name);
|
|
48
|
+
if (entry.isDirectory()) {
|
|
49
|
+
walk(p, out);
|
|
50
|
+
} else if (SCAN_EXTS.has(path.extname(entry.name))) {
|
|
51
|
+
out.push(p);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function main(): number {
|
|
57
|
+
let fixtureText: string;
|
|
58
|
+
try {
|
|
59
|
+
fixtureText = fs.readFileSync(FIXTURES, { encoding: 'utf-8' });
|
|
60
|
+
} catch {
|
|
61
|
+
process.stderr.write(`lint-eval-fixture-citations: cannot read ${FIXTURES}\n`);
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Ids are declared as `### daf-...` headings or as leading table cells.
|
|
66
|
+
const ids = new Set<string>();
|
|
67
|
+
for (const m of fixtureText.matchAll(/^###\s+(daf-[a-z0-9-]+)\s*$/gm)) {
|
|
68
|
+
ids.add(m[1] as string);
|
|
69
|
+
}
|
|
70
|
+
for (const m of fixtureText.matchAll(/^\|\s*`(daf-[a-z0-9-]+)`\s*\|/gm)) {
|
|
71
|
+
ids.add(m[1] as string);
|
|
72
|
+
}
|
|
73
|
+
if (ids.size === 0) {
|
|
74
|
+
process.stderr.write('lint-eval-fixture-citations: no fixture ids found — parser drift.\n');
|
|
75
|
+
return 1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const files: string[] = [];
|
|
79
|
+
for (const root of SCAN_ROOTS) {
|
|
80
|
+
walk(root, files);
|
|
81
|
+
}
|
|
82
|
+
const haystack = files
|
|
83
|
+
.map((f) => {
|
|
84
|
+
try {
|
|
85
|
+
return fs.readFileSync(f, { encoding: 'utf-8' });
|
|
86
|
+
} catch {
|
|
87
|
+
return '';
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
.join('\n');
|
|
91
|
+
|
|
92
|
+
const uncited = [...ids].filter((id) => !haystack.includes(id)).sort();
|
|
93
|
+
if (uncited.length > 0) {
|
|
94
|
+
for (const id of uncited) {
|
|
95
|
+
process.stdout.write(
|
|
96
|
+
`lint-eval-fixture-citations: \`${id}\` is cited by no contract, ` +
|
|
97
|
+
'guideline, skill, rule, or test — an eval nobody runs.\n',
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
process.stderr.write(
|
|
101
|
+
`lint-eval-fixture-citations: ${uncited.length} of ${ids.size} fixture id(s) uncited.\n`,
|
|
102
|
+
);
|
|
103
|
+
return 1;
|
|
104
|
+
}
|
|
105
|
+
if (!QUIET) {
|
|
106
|
+
process.stdout.write(
|
|
107
|
+
`lint-eval-fixture-citations: ${ids.size} fixture id(s), all cited.\n`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
process.exit(main());
|
|
Binary file
|