@event4u/agent-config 14.10.0 → 14.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +161 -208
- package/README.md +1 -1
- package/dist/agent-src/commands/design.md +88 -0
- package/dist/agent-src/commands/project/analyze.md +47 -0
- package/dist/agent-src/commands/review/changes.md +67 -6
- package/dist/agent-src/commands/roadmap/create.md +49 -0
- package/dist/agent-src/commands/roadmap/next.md +27 -11
- package/dist/agent-src/commands/roadmap/process-full.md +14 -0
- package/dist/agent-src/commands/video/from-script.md +60 -3
- package/dist/agent-src/commands/video/stitch.md +14 -0
- package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
- package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
- package/dist/agent-src/rules/active-remediation.md +3 -3
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/context-hygiene.md +13 -33
- package/dist/agent-src/rules/council-availability.md +2 -2
- package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
- package/dist/agent-src/rules/design-fidelity.md +18 -0
- package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
- package/dist/agent-src/rules/evaluator-independence.md +56 -44
- package/dist/agent-src/rules/fix-what-you-see.md +9 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
- package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
- package/dist/agent-src/rules/playbook-precedence.md +105 -0
- package/dist/agent-src/rules/recurring-criticism.md +3 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
- package/dist/agent-src/rules/scale-discipline.md +24 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
- package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
- package/dist/agent-src/rules/ui-audit-gate.md +27 -15
- package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
- package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
- package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
- package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
- package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
- package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
- package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
- package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
- package/dist/agent-src/skills/brand/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
- package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
- package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
- package/dist/agent-src/skills/code-review/SKILL.md +75 -5
- package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
- package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
- package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
- package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
- package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
- package/dist/agent-src/skills/design-review/SKILL.md +79 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
- package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
- package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
- package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
- package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
- package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
- package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
- package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
- package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
- package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
- package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
- package/dist/agent-src/skills/iconography/SKILL.md +3 -0
- package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
- package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
- package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
- package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
- package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
- package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
- package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
- package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
- package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
- package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
- package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
- package/dist/agent-src/skills/override-management/SKILL.md +3 -0
- package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
- package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
- package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
- package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
- package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
- package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
- package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
- package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
- package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
- package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
- package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
- package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
- package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
- package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
- package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
- package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
- package/dist/agent-src/skills/terraform/SKILL.md +3 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
- package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
- package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
- package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/playbook.md +75 -0
- package/dist/agent-src/templates/roadmaps.md +37 -0
- package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/dist/cli/commands/uiAudit.js +221 -0
- package/dist/cli/commands/uiRender.js +206 -0
- package/dist/cli/main.js +22 -1
- package/dist/cli/mcp/content.js +64 -1
- package/dist/cli/mcp/dispatch.js +175 -10
- package/dist/cli/registry.js +3 -0
- package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
- package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
- package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
- package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
- package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
- package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +8 -6
- package/dist/cli-delegate/cmd_conformance.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +1 -1
- package/dist/cli-delegate/cmd_preflight.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +70 -9
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +362 -127
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +18 -8
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -6
- package/dist/hooks/dispatch.js +2575 -1472
- package/dist/install/install.mjs +800 -708
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1685 -1250
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/lean_projection_mode.js +40 -0
- package/dist/scripts/_lib/scoped_projection.js +84 -0
- package/dist/scripts/_lib/ui_surface.js +89 -0
- package/dist/scripts/condense.js +6 -10
- package/dist/scripts/project_thin_rules.js +40 -2
- package/dist/server/schemas/settings.js +6 -0
- package/dist/shared/skillRanking.js +159 -0
- package/docs/contracts/provider-lifecycle.md +47 -18
- package/docs/contracts/settings-classes.md +35 -5
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
- package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
- package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
- package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
- package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
- package/docs/guidelines/code-clarity.md +21 -0
- package/docs/guidelines/design-antipatterns.md +4 -2
- package/docs/guidelines/design-asset-discipline.md +38 -0
- package/docs/guidelines/design-fidelity-mechanics.md +45 -29
- package/docs/guidelines/design-handover-extraction.md +35 -5
- package/docs/guidelines/design-modes.md +41 -1
- package/docs/guidelines/monorepo-antipatterns.md +141 -0
- package/docs/guidelines/redundancy-taxonomy.md +180 -0
- package/llms.txt +50 -39
- package/package.json +6 -2
- package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
- package/src/config/agent-settings.template.yml +44 -0
- package/src/config/assurance-capability-registry.json +223 -0
- package/src/config/assurance-threshold-budget.json +65 -0
- package/src/config/budgets.yml +19 -0
- package/src/config/ci-local-parity.yml +29 -0
- package/src/config/discovery/prompt-patterns.yml +56 -0
- package/src/config/discovery/unassigned-artefacts.yml +2 -0
- package/src/config/dispatch-economy-metrics.json +4 -2
- package/src/config/estate-count-budget.json +8 -3
- package/src/config/evaluator-budgets.json +14 -14
- package/src/config/gate-coverage.yml +392 -8
- package/src/config/gate-violation-baselines.json +76 -72
- package/src/config/hook-latency-budget.json +1 -0
- package/src/config/hook-token-budget.json +137 -125
- package/src/config/pack-size-budget.json +39 -10
- package/src/config/preamble-payload-budget.json +97 -71
- package/src/config/quorum-attendance-budget.json +12 -4
- package/src/config/routing-coverage-seed.json +29 -0
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/config/rule-stub-ceilings.json +112 -91
- package/src/config/suggestion-capture.json +28 -0
- package/src/config/surface-matrix.yml +21 -2
- package/src/config/web-launch-readiness.json +188 -0
- package/src/scripts/_cli/cmd_doctor.ts +15 -16
- package/src/scripts/_cli/doctor_install_mode.ts +49 -0
- package/src/scripts/_cli/doctor_overrides.ts +154 -0
- package/src/scripts/_dispatch.bash +17 -0
- package/src/scripts/_lib/as_of.ts +412 -0
- package/src/scripts/_lib/exec_evidence.ts +7 -0
- package/src/scripts/_lib/gate_baseline.ts +150 -1
- package/src/scripts/_lib/hook_settings.ts +33 -0
- package/src/scripts/_lib/host_listing_model.ts +192 -0
- package/src/scripts/_lib/lean_projection_mode.ts +44 -0
- package/src/scripts/_lib/mcp_bridge.ts +199 -0
- package/src/scripts/_lib/review_independence.ts +62 -10
- package/src/scripts/_lib/rule_injection.ts +239 -0
- package/src/scripts/_lib/run_checkpoint.ts +54 -1
- package/src/scripts/_lib/scoped_projection.ts +96 -0
- package/src/scripts/_lib/session_register.ts +44 -2
- package/src/scripts/_lib/skill_catalogue.ts +38 -2
- package/src/scripts/_lib/skill_estate.ts +115 -0
- package/src/scripts/_lib/transcript_reads.ts +207 -0
- package/src/scripts/_lib/ui_authority.ts +343 -0
- package/src/scripts/ai-video/adapters/fal.sh +8 -3
- package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
- package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
- package/src/scripts/ai-video/adapters/kling.sh +10 -0
- package/src/scripts/ai-video/adapters/sora.sh +10 -0
- package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
- package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
- package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
- package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
- package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
- package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
- package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
- package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
- package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
- package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
- package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
- package/src/scripts/ai-video/smoke-trace.sh +450 -2
- package/src/scripts/ai-video/stitch.sh +191 -10
- package/src/scripts/ai-video/test-pipeline.sh +84 -6
- package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
- package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
- package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
- package/src/scripts/ai_council/clients.ts +3 -2
- package/src/scripts/ai_council/consensus.ts +63 -6
- package/src/scripts/ai_council/events_log.ts +46 -1
- package/src/scripts/ai_council/orchestrator.ts +103 -108
- package/src/scripts/ai_council/orchestrator_results.ts +166 -0
- package/src/scripts/ai_council/prompts.ts +12 -5
- package/src/scripts/ai_council/quorum.ts +82 -1
- package/src/scripts/ai_council/quorum_wiring.ts +82 -5
- package/src/scripts/ai_council/stance_tally.ts +22 -0
- package/src/scripts/bench_hook_latency.ts +62 -0
- package/src/scripts/build_proof.ts +12 -1
- package/src/scripts/capture_skill_catalogue.ts +21 -0
- package/src/scripts/check_always_budget.ts +2 -1
- package/src/scripts/check_augmentignore.ts +2 -1
- package/src/scripts/check_beta_review_markers.ts +2 -1
- package/src/scripts/check_bundle_path_leakage.ts +162 -7
- package/src/scripts/check_command_examples.ts +557 -0
- package/src/scripts/check_composite_arming.ts +364 -0
- package/src/scripts/check_corpus_staleness.ts +2 -1
- package/src/scripts/check_council_pin_staleness.ts +3 -1
- package/src/scripts/check_enforcement_coverage.ts +116 -3
- package/src/scripts/check_enforcement_denominator.ts +365 -0
- package/src/scripts/check_estate_count.ts +122 -3
- package/src/scripts/check_gate_coverage.ts +2 -1
- package/src/scripts/check_hook_bundle_freshness.ts +13 -1
- package/src/scripts/check_knowledge_cards.ts +2 -1
- package/src/scripts/check_knowledge_pages.ts +3 -2
- package/src/scripts/check_memory.ts +2 -1
- package/src/scripts/check_no_automerge_key.ts +287 -0
- package/src/scripts/check_pack_conformance_fixture.ts +565 -0
- package/src/scripts/check_preamble_payload_budget.ts +30 -3
- package/src/scripts/check_proposal.ts +2 -1
- package/src/scripts/check_reach_staleness.ts +2 -1
- package/src/scripts/check_release_adjacent_health.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +5 -0
- package/src/scripts/check_review_schema.ts +34 -1
- package/src/scripts/check_roadmap_trackable.ts +48 -3
- package/src/scripts/check_routing_coverage.ts +352 -0
- package/src/scripts/check_score_contract.ts +505 -0
- package/src/scripts/check_skill_admissions.ts +514 -0
- package/src/scripts/check_source_size_budget.ts +2 -1
- package/src/scripts/check_standing_payload_delta.ts +505 -0
- package/src/scripts/check_trigger_evals.ts +2 -1
- package/src/scripts/check_web_launch_readiness.ts +705 -0
- package/src/scripts/classify_change_risk.ts +281 -0
- package/src/scripts/compute_skill_tiers.ts +186 -0
- package/src/scripts/condense.ts +8 -13
- package/src/scripts/council_attendance_metrics.ts +183 -0
- package/src/scripts/council_cli.ts +10 -8
- package/src/scripts/council_parse_rate.ts +116 -0
- package/src/scripts/derive_playbooks.ts +406 -0
- package/src/scripts/description_route_check.ts +494 -0
- package/src/scripts/design_slop_rules.ts +56 -2
- package/src/scripts/dispatch_r2_reviewer.ts +16 -0
- package/src/scripts/frontend_corpus_hash.ts +116 -0
- package/src/scripts/grade_target_readiness.ts +478 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +124 -16
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/design_pass_hook.ts +356 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
- package/src/scripts/hooks/rule_inject_hook.ts +318 -0
- package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
- package/src/scripts/hot_context_hook.ts +74 -7
- package/src/scripts/install.ts +40 -89
- package/src/scripts/lint_adapter_tier.ts +663 -0
- package/src/scripts/lint_archived_skills.ts +93 -0
- package/src/scripts/lint_budget_ownership.ts +56 -5
- package/src/scripts/lint_deterministic_time.ts +470 -0
- package/src/scripts/lint_framework_leakage.ts +5 -0
- package/src/scripts/lint_handoffs.ts +525 -1
- package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
- package/src/scripts/lint_marketplace.ts +88 -0
- package/src/scripts/lint_media_policy_linkage.ts +140 -1
- package/src/scripts/lint_one_off_age.ts +6 -1
- package/src/scripts/lint_override_kernel_guard.ts +87 -5
- package/src/scripts/lint_roadmap_complexity.ts +56 -0
- package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
- package/src/scripts/lint_rule_norm_pin.ts +321 -0
- package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
- package/src/scripts/lint_spawn_payload.ts +42 -5
- package/src/scripts/lint_symptom_intake.ts +2 -1
- package/src/scripts/mcp_parity_smoke.ts +30 -4
- package/src/scripts/mcp_render.ts +66 -1
- package/src/scripts/mcp_tool_fingerprint.ts +241 -0
- package/src/scripts/measure_risk_class_drift.ts +140 -0
- package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
- package/src/scripts/media/lib/adapter-common.sh +211 -1
- package/src/scripts/media/lib/adapter-contract.md +74 -6
- package/src/scripts/model_rule_injection.ts +907 -0
- package/src/scripts/pack_install_smoke.ts +363 -0
- package/src/scripts/pr_conflict_census.ts +187 -0
- package/src/scripts/project_thin_rules.ts +45 -2
- package/src/scripts/release.ts +66 -860
- package/src/scripts/release_drill.ts +59 -3
- package/src/scripts/release_env.ts +298 -0
- package/src/scripts/release_publication.ts +720 -0
- package/src/scripts/report_pack_delta.ts +204 -0
- package/src/scripts/roadmap_context.ts +778 -0
- package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
- package/src/scripts/schemas/rule.schema.json +24 -2
- package/src/scripts/schemas/skill.schema.json +39 -0
- package/src/scripts/schemas/ui-authority.schema.json +114 -0
- package/src/scripts/select_analysis_mode.ts +112 -0
- package/src/scripts/session_register_hook.ts +29 -3
- package/src/scripts/sessions_cli.ts +67 -3
- package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
- package/src/scripts/sync_pr_branch.ts +40 -1
- package/src/scripts/token_sink_report.ts +239 -0
- package/src/scripts/trigger_coverage.ts +122 -3
- package/src/scripts/update_counts.ts +7 -3
- package/src/scripts/validate_frontmatter.ts +66 -0
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +183 -0
- package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
- package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
- package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
- package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
- package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
- package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
- package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
- package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
- package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
- package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
- package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
- package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
- package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
- package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
- package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
- package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
- package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
- package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
- package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
- package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
- package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
- package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
- package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
- package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
- package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -55
- package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
- package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
- package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
- package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
- package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
- package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
- package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
- package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
- package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
- package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
- package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
- package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
- package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
- package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
- package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
- package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
- package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
- package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
- package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
- package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
- package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
- package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
- package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
- package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
- package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
- package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
- package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
- package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
- package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
- package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
- package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
- package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
- package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
- package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
- package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
- package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
- package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
- package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
- package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
- package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
- package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
- package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
- package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
- package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
- package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
- package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
- package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
- package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
- package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
- package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
- package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
- package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
- package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
- package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
- package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
- package/dist/cli/agent-config.js.map +0 -1
- package/dist/cli/bash/runBash.js.map +0 -1
- package/dist/cli/commands/commands.js.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/doctorShell.js.map +0 -1
- package/dist/cli/commands/mcpServer.js.map +0 -1
- package/dist/cli/commands/packs.js.map +0 -1
- package/dist/cli/commands/profiles.js.map +0 -1
- package/dist/cli/commands/recordTriggerEval.js.map +0 -1
- package/dist/cli/commands/rtkDetect.js.map +0 -1
- package/dist/cli/commands/settings.js.map +0 -1
- package/dist/cli/commands/uiServe.js.map +0 -1
- package/dist/cli/commands/versions.js.map +0 -1
- package/dist/cli/commands/workspaces.js.map +0 -1
- package/dist/cli/configRoot.js.map +0 -1
- package/dist/cli/discovery/loadManifest.js.map +0 -1
- package/dist/cli/firstRunNotice.js.map +0 -1
- package/dist/cli/help.js.map +0 -1
- package/dist/cli/initRouting.js.map +0 -1
- package/dist/cli/log/logger.js.map +0 -1
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/mcp/content.js.map +0 -1
- package/dist/cli/mcp/dispatch.js.map +0 -1
- package/dist/cli/mcp/stdio.js.map +0 -1
- package/dist/cli/paths.js.map +0 -1
- package/dist/cli/python/knowledge_ingest.js.map +0 -1
- package/dist/cli/python/workspace_analytics.js.map +0 -1
- package/dist/cli/python/workspace_crypto.js.map +0 -1
- package/dist/cli/python/workspace_documents.js.map +0 -1
- package/dist/cli/python/workspace_drive.js.map +0 -1
- package/dist/cli/python/workspace_drive_health.js.map +0 -1
- package/dist/cli/python/workspace_explain.js.map +0 -1
- package/dist/cli/python/workspace_hosts.js.map +0 -1
- package/dist/cli/python/workspace_inbox.js.map +0 -1
- package/dist/cli/python/workspace_render.js.map +0 -1
- package/dist/cli/python/workspace_roles.js.map +0 -1
- package/dist/cli/python/workspace_secrets.js.map +0 -1
- package/dist/cli/python/workspace_sessions.js.map +0 -1
- package/dist/cli/python/workspace_skills.js.map +0 -1
- package/dist/cli/registry.js.map +0 -1
- package/dist/install/agentSwitchDetection.js.map +0 -1
- package/dist/install/agentSwitchProfile.js.map +0 -1
- package/dist/install/atomic.js.map +0 -1
- package/dist/install/claudePathsPlan.js.map +0 -1
- package/dist/install/conflict.js.map +0 -1
- package/dist/install/detect.js.map +0 -1
- package/dist/install/emit_host_rules_cli.js.map +0 -1
- package/dist/install/globalRuleLayers.js.map +0 -1
- package/dist/install/hostLayerFingerprint.js.map +0 -1
- package/dist/install/partitionEligibility.js.map +0 -1
- package/dist/install/paths.js.map +0 -1
- package/dist/install/plan.js.map +0 -1
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/rtkDetection.js.map +0 -1
- package/dist/install/ruleInScope.js.map +0 -1
- package/dist/install/ruleLayerPartition.js.map +0 -1
- package/dist/install/rule_scope.js.map +0 -1
- package/dist/install/rule_scope_cli.js.map +0 -1
- package/dist/install/selectedTools.js.map +0 -1
- package/dist/install/toolDetection.js.map +0 -1
- package/dist/install/txlog.js.map +0 -1
- package/dist/install/types.js.map +0 -1
- package/dist/install/wizard-plan.js.map +0 -1
- package/dist/install/wizardDismissals.js.map +0 -1
- package/dist/scripts/_lib/agent_settings.js.map +0 -1
- package/dist/scripts/_lib/agent_src.js.map +0 -1
- package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
- package/dist/scripts/_lib/claude_plugin.js.map +0 -1
- package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
- package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
- package/dist/scripts/_lib/environment_detector.js.map +0 -1
- package/dist/scripts/_lib/host_launch.js.map +0 -1
- package/dist/scripts/_lib/install_layout.js.map +0 -1
- package/dist/scripts/_lib/installed_lock.js.map +0 -1
- package/dist/scripts/_lib/model_tier.js.map +0 -1
- package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
- package/dist/scripts/_lib/scoped_projection.js.map +0 -1
- package/dist/scripts/_lib/script_output.js.map +0 -1
- package/dist/scripts/_lib/spawn_env.js.map +0 -1
- package/dist/scripts/_lib/surface_tiers.js.map +0 -1
- package/dist/scripts/_lib/token_count.js.map +0 -1
- package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
- package/dist/scripts/_lib/user_global_paths.js.map +0 -1
- package/dist/scripts/ai_council/modes.js.map +0 -1
- package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
- package/dist/scripts/condense.js.map +0 -1
- package/dist/scripts/project_thin_rules.js.map +0 -1
- package/dist/server/app.js.map +0 -1
- package/dist/server/io/atomicMultiWrite.js.map +0 -1
- package/dist/server/io/atomicWrite.js.map +0 -1
- package/dist/server/io/sharedWriteCheck.js.map +0 -1
- package/dist/server/io/substituteTemplate.js.map +0 -1
- package/dist/server/io/yamlIO.js.map +0 -1
- package/dist/server/nicknameResolver.js.map +0 -1
- package/dist/server/port.js.map +0 -1
- package/dist/server/routes/discovery.js.map +0 -1
- package/dist/server/routes/install.js.map +0 -1
- package/dist/server/routes/ping.js.map +0 -1
- package/dist/server/routes/schema.js.map +0 -1
- package/dist/server/routes/settings.js.map +0 -1
- package/dist/server/routes/settingsChanges.js.map +0 -1
- package/dist/server/routes/userMd.js.map +0 -1
- package/dist/server/routes/wizard.js.map +0 -1
- package/dist/server/routes/workspace.js.map +0 -1
- package/dist/server/schemas/settings.js.map +0 -1
- package/dist/server/serverInfo.js.map +0 -1
- package/dist/server/token.js.map +0 -1
- package/dist/server/writeRoot.js.map +0 -1
- package/dist/shared/capabilities.js.map +0 -1
- package/dist/shared/interactiveContext.js.map +0 -1
- package/dist/shared/nicknamePrefill.js.map +0 -1
- package/dist/shared/settingsAsks.js.map +0 -1
- package/dist/shared/settingsCarveOut.js.map +0 -1
- package/dist/shared/settingsClasses.js.map +0 -1
- package/dist/shared/settingsConsent.js.map +0 -1
- package/dist/shared/settingsSurface.js.map +0 -1
- package/dist/shared/userMd/formAdapter.js.map +0 -1
- package/dist/shared/userMd/schema.js.map +0 -1
- package/dist/shared/userMd/utils.js.map +0 -1
- package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
- package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
- package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
- package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
- package/src/scripts/_lib/secret_detector.test.ts +0 -108
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
- package/src/scripts/_lib/untrusted_content.test.ts +0 -175
- package/src/scripts/check_secret_leak.test.ts +0 -90
- package/src/scripts/design_slop_rules.test.ts +0 -239
- package/src/scripts/self_review_gate.test.ts +0 -296
- package/src/shared/capabilities.test.ts +0 -43
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* check_playbook_invokes — a `configured` playbook may not name a procedure the tree no
|
|
3
|
+
* longer has.
|
|
4
|
+
*
|
|
5
|
+
* Ships in the consumer `scripts/` template so it runs in the CONSUMER's CI, over the
|
|
6
|
+
* consumer's own playbooks and the consumer's own configuration. That placement is the
|
|
7
|
+
* whole design: staleness is a fact about their repository, and a gate in this package
|
|
8
|
+
* could only ever check this package.
|
|
9
|
+
*
|
|
10
|
+
* The grade is the contract (ADR-244). `configured` asserts every step invokes something
|
|
11
|
+
* present in the tree; when a generator is renamed, that assertion becomes false silently —
|
|
12
|
+
* the playbook still reads like a procedure and the command no longer exists. This check is
|
|
13
|
+
* what turns that into a failure instead of a surprise at the next `turbo gen`.
|
|
14
|
+
*
|
|
15
|
+
* Three resolvable kinds, and no more: a script name in the package manifest, a declared
|
|
16
|
+
* task in the task file, and a registered generator template. An Nx or Plop id is reported
|
|
17
|
+
* `unsupported` — NEVER as resolved and never as missing, because discovering those needs a
|
|
18
|
+
* binary this check deliberately does not run. Reporting a real id as missing would be the
|
|
19
|
+
* worse error: it would push a correct playbook to `observed`.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* check_playbook_invokes [--root <dir>] [--home <dir>] [--quiet]
|
|
23
|
+
*
|
|
24
|
+
* Exit 0 = every `configured` playbook resolves (or there are none).
|
|
25
|
+
* Exit 1 = at least one `configured` step names an id the tree does not have.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import * as fs from 'node:fs';
|
|
29
|
+
import * as path from 'node:path';
|
|
30
|
+
|
|
31
|
+
/** Playbooks are a context type (ADR-244), so the home is the contexts home. */
|
|
32
|
+
const DEFAULT_HOME = path.join('agents', 'settings', 'contexts');
|
|
33
|
+
|
|
34
|
+
export interface PlaybookHead {
|
|
35
|
+
readonly file: string;
|
|
36
|
+
readonly grade: string;
|
|
37
|
+
readonly invokes: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type Verdict = 'resolved' | 'missing' | 'unsupported';
|
|
41
|
+
|
|
42
|
+
export interface Check {
|
|
43
|
+
readonly file: string;
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly verdict: Verdict;
|
|
46
|
+
/** Where it resolved, for a `resolved` verdict. */
|
|
47
|
+
readonly where: string | null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Ids this check cannot resolve without running a consumer binary. */
|
|
51
|
+
const UNSUPPORTED_PREFIXES = ['nx ', 'nx:', 'plop ', 'plop:'] as const;
|
|
52
|
+
|
|
53
|
+
const readJson = (p: string): Record<string, unknown> | null => {
|
|
54
|
+
try {
|
|
55
|
+
return JSON.parse(fs.readFileSync(p, 'utf8')) as Record<string, unknown>;
|
|
56
|
+
} catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const asRecord = (v: unknown): Record<string, unknown> =>
|
|
62
|
+
v !== null && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : {};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Minimal frontmatter read — `grade` and the `invokes` list only.
|
|
66
|
+
*
|
|
67
|
+
* Deliberately not a YAML dependency: this file ships into a consumer repository, where
|
|
68
|
+
* adding a parser dependency to run one gate is a cost the consumer did not ask for.
|
|
69
|
+
*/
|
|
70
|
+
export const parseHead = (file: string, text: string): PlaybookHead | null => {
|
|
71
|
+
if (!text.startsWith('---')) return null;
|
|
72
|
+
const end = text.indexOf('\n---', 3);
|
|
73
|
+
if (end < 0) return null;
|
|
74
|
+
const head = text.slice(3, end);
|
|
75
|
+
const gradeMatch = /^grade:\s*["']?([A-Za-z]+)["']?\s*$/m.exec(head);
|
|
76
|
+
if (!gradeMatch) return null;
|
|
77
|
+
|
|
78
|
+
const invokes: string[] = [];
|
|
79
|
+
const lines = head.split('\n');
|
|
80
|
+
let inList = false;
|
|
81
|
+
for (const line of lines) {
|
|
82
|
+
if (/^invokes:\s*$/.test(line)) {
|
|
83
|
+
inList = true;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (inList) {
|
|
87
|
+
const item = /^\s+-\s*["']?(.+?)["']?\s*$/.exec(line);
|
|
88
|
+
if (item?.[1] !== undefined) {
|
|
89
|
+
invokes.push(item[1]);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
inList = false;
|
|
93
|
+
}
|
|
94
|
+
// An inline list is the other legal shape and a reader that only handled the block
|
|
95
|
+
// form would report a correct playbook as having no ids at all.
|
|
96
|
+
const inline = /^invokes:\s*\[(.*)\]\s*$/.exec(line);
|
|
97
|
+
if (inline?.[1] !== undefined) {
|
|
98
|
+
for (const part of inline[1].split(',')) {
|
|
99
|
+
const v = part.trim().replace(/^["']|["']$/g, '');
|
|
100
|
+
if (v.length > 0) invokes.push(v);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { file, grade: gradeMatch[1] as string, invokes };
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
/** Generator templates registered in the tree, as `<runner> gen <name>` ids. */
|
|
108
|
+
export const registeredGenerators = (root: string): Map<string, string> => {
|
|
109
|
+
const out = new Map<string, string>();
|
|
110
|
+
const dir = path.join(root, 'turbo', 'generators');
|
|
111
|
+
if (!fs.existsSync(dir)) return out;
|
|
112
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
113
|
+
const full = path.join(dir, entry.name);
|
|
114
|
+
if (entry.isDirectory()) {
|
|
115
|
+
out.set(entry.name, path.relative(root, full));
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const text = fs.readFileSync(full, 'utf8');
|
|
119
|
+
for (const m of text.matchAll(/\.(?:set|add)Generator\(\s*['"]([A-Za-z0-9_-]+)['"]/g)) {
|
|
120
|
+
out.set(m[1] as string, path.relative(root, full));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export const resolveId = (
|
|
127
|
+
root: string,
|
|
128
|
+
id: string,
|
|
129
|
+
gens: Map<string, string>,
|
|
130
|
+
): { verdict: Verdict; where: string | null } => {
|
|
131
|
+
const lower = id.toLowerCase();
|
|
132
|
+
if (UNSUPPORTED_PREFIXES.some((p) => lower.startsWith(p))) {
|
|
133
|
+
return { verdict: 'unsupported', where: null };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const gen = /^\S+\s+gen\s+([A-Za-z0-9_-]+)/.exec(id);
|
|
137
|
+
if (gen) {
|
|
138
|
+
const name = gen[1] as string;
|
|
139
|
+
return gens.has(name)
|
|
140
|
+
? { verdict: 'resolved', where: gens.get(name) ?? null }
|
|
141
|
+
: { verdict: 'missing', where: null };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const tasks = asRecord(readJson(path.join(root, 'turbo.json'))?.tasks);
|
|
145
|
+
if (Object.prototype.hasOwnProperty.call(tasks, id)) {
|
|
146
|
+
return { verdict: 'resolved', where: 'turbo.json#tasks' };
|
|
147
|
+
}
|
|
148
|
+
const scripts = asRecord(readJson(path.join(root, 'package.json'))?.scripts);
|
|
149
|
+
if (Object.prototype.hasOwnProperty.call(scripts, id)) {
|
|
150
|
+
return { verdict: 'resolved', where: 'package.json#scripts' };
|
|
151
|
+
}
|
|
152
|
+
return { verdict: 'missing', where: null };
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
export const checkAll = (root: string, home: string): Check[] => {
|
|
156
|
+
if (!fs.existsSync(home)) return [];
|
|
157
|
+
const gens = registeredGenerators(root);
|
|
158
|
+
const out: Check[] = [];
|
|
159
|
+
for (const name of fs.readdirSync(home).sort()) {
|
|
160
|
+
if (!name.endsWith('.md')) continue;
|
|
161
|
+
const file = path.join(home, name);
|
|
162
|
+
const head = parseHead(file, fs.readFileSync(file, 'utf8'));
|
|
163
|
+
// Only `configured` is a claim about the tree. An `observed` playbook already says
|
|
164
|
+
// its steps are unverified, so failing it here would punish the honest grade.
|
|
165
|
+
if (head === null || head.grade !== 'configured') continue;
|
|
166
|
+
for (const id of head.invokes) {
|
|
167
|
+
const { verdict, where } = resolveId(root, id, gens);
|
|
168
|
+
out.push({ file, id, verdict, where });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* The remediation. BOTH options are printed verbatim on every failure, and neither is
|
|
176
|
+
* "delete the line": a playbook that loses its evidence line stops being checkable, which
|
|
177
|
+
* turns a caught drift into an uncatchable one.
|
|
178
|
+
*/
|
|
179
|
+
export const REMEDIATION = [
|
|
180
|
+
'Two ways to fix this, and only two:',
|
|
181
|
+
' 1. Fix the `invokes` id — the procedure moved, so point the playbook at where it moved to.',
|
|
182
|
+
' 2. Downgrade the step to `observed` and cite the commit it was last seen working in.',
|
|
183
|
+
'Do NOT delete the evidence line. A playbook without it is not a weaker claim, it is an',
|
|
184
|
+
'unverifiable one — and the next drift goes unnoticed.',
|
|
185
|
+
].join('\n');
|
|
186
|
+
|
|
187
|
+
const main = (): number => {
|
|
188
|
+
const argv = process.argv.slice(2);
|
|
189
|
+
const arg = (flag: string): string | null => {
|
|
190
|
+
const i = argv.indexOf(flag);
|
|
191
|
+
return i >= 0 && i + 1 < argv.length ? String(argv[i + 1]) : null;
|
|
192
|
+
};
|
|
193
|
+
const quiet = argv.includes('--quiet');
|
|
194
|
+
const root = arg('--root') ?? '.';
|
|
195
|
+
const home = arg('--home') ?? path.join(root, DEFAULT_HOME);
|
|
196
|
+
|
|
197
|
+
const checks = checkAll(root, home);
|
|
198
|
+
const missing = checks.filter((c) => c.verdict === 'missing');
|
|
199
|
+
const unsupported = checks.filter((c) => c.verdict === 'unsupported');
|
|
200
|
+
|
|
201
|
+
if (!quiet) {
|
|
202
|
+
for (const u of unsupported) {
|
|
203
|
+
process.stdout.write(
|
|
204
|
+
`ℹ️ ${u.file}: \`${u.id}\` is unsupported by this check (its discovery needs a ` +
|
|
205
|
+
`consumer binary) — reported, not treated as missing\n`,
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
process.stdout.write(
|
|
209
|
+
`scanned: ${String(checks.length)} configured step(s) across ${String(new Set(checks.map((c) => c.file)).size)} playbook(s)\n`,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (missing.length === 0) {
|
|
214
|
+
if (!quiet) {
|
|
215
|
+
process.stdout.write('✅ check_playbook_invokes: every configured step resolves in the tree.\n');
|
|
216
|
+
}
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
for (const m of missing) {
|
|
221
|
+
process.stderr.write(
|
|
222
|
+
`❌ ${m.file}: step invoking \`${m.id}\` does not resolve — no such script, task, or generator in the tree\n`,
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
process.stderr.write(`\n${REMEDIATION}\n`);
|
|
226
|
+
return 1;
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
if (process.argv[1] !== undefined && process.argv[1].includes('check_playbook_invokes')) {
|
|
230
|
+
process.exit(main());
|
|
231
|
+
}
|
|
@@ -18,13 +18,30 @@ import {
|
|
|
18
18
|
agent_directive,
|
|
19
19
|
} from '../../delivery_state.js';
|
|
20
20
|
import { has_design_system, placeholder_paths, provided_artifact } from './design.js';
|
|
21
|
+
import { _playbook_lines, _scaffold_playbooks } from './scaffold.js';
|
|
21
22
|
import {
|
|
22
23
|
is_ambiguous_stack,
|
|
23
24
|
bundle_line,
|
|
25
|
+
scope_lines,
|
|
24
26
|
unsupported_stack_questions,
|
|
25
27
|
} from './stack_bundles.js';
|
|
26
28
|
|
|
27
29
|
/** Map `state.stack.frontend` → agent-directive skill name. */
|
|
30
|
+
/**
|
|
31
|
+
* Task words that make a playbook relevant to the `apply` verb.
|
|
32
|
+
*
|
|
33
|
+
* Same shape as `scaffold`'s list and deliberately a SEPARATE constant: `apply` implements
|
|
34
|
+
* into an existing surface, so a repository may reasonably carry a playbook for one verb and
|
|
35
|
+
* not the other. One shared list would silently dispatch a scaffold-only procedure here.
|
|
36
|
+
*/
|
|
37
|
+
export const APPLY_VERB_TERMS: ReadonlyArray<string> = [
|
|
38
|
+
'component',
|
|
39
|
+
'page',
|
|
40
|
+
'route',
|
|
41
|
+
'screen',
|
|
42
|
+
'view',
|
|
43
|
+
];
|
|
44
|
+
|
|
28
45
|
export const STACK_DIRECTIVES: Record<string, string> = {
|
|
29
46
|
'blade-livewire-flux': 'ui-apply-blade-livewire-flux',
|
|
30
47
|
'blade-livewire': 'ui-apply-blade-livewire',
|
|
@@ -267,10 +284,17 @@ function _delegate_to_stack_skill(state: DeliveryState): StepResult {
|
|
|
267
284
|
});
|
|
268
285
|
}
|
|
269
286
|
const provided = provided_artifact(state.ui_design as Record<string, Any> | null);
|
|
287
|
+
// The repository's own procedure goes ahead of the stack skill when it has one. Empty
|
|
288
|
+
// when it does not, which is what keeps a project with no playbook home byte-identical.
|
|
289
|
+
// Imported from `scaffold` rather than duplicated: two copies of a scope-match rule
|
|
290
|
+
// drift, and the drift would be invisible — both lanes would still emit *something*.
|
|
291
|
+
const playbook_lines = _playbook_lines(_scaffold_playbooks(state, APPLY_VERB_TERMS));
|
|
270
292
|
const lines: string[] = [
|
|
271
293
|
agent_directive(directive),
|
|
294
|
+
...playbook_lines,
|
|
272
295
|
`> Stack: \`${stack_label}\`. Implementing the locked design brief.`,
|
|
273
296
|
bundle_line(state.stack, 'build', stack_label),
|
|
297
|
+
...scope_lines(state.stack),
|
|
274
298
|
'> Microcopy is locked — every button label, empty-state ' +
|
|
275
299
|
'message, and validation message must come verbatim from ' +
|
|
276
300
|
'`state.ui_design.microcopy`.',
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
import {
|
|
19
19
|
is_ambiguous_stack,
|
|
20
20
|
bundle_line,
|
|
21
|
+
scope_lines,
|
|
21
22
|
unsupported_stack_questions,
|
|
22
23
|
} from './stack_bundles.js';
|
|
23
24
|
|
|
@@ -266,6 +267,7 @@ function _delegate_to_polish_skill(
|
|
|
266
267
|
agent_directive(directive),
|
|
267
268
|
`> Stack: \`${stack_label}\`. Polish round ${next_round} of ${ceiling}.`,
|
|
268
269
|
bundle_line(state.stack, 'build', stack_label),
|
|
270
|
+
...scope_lines(state.stack),
|
|
269
271
|
findings_line,
|
|
270
272
|
'> Fix chart-type / contrast findings against the adopted ' +
|
|
271
273
|
"corpus rows (design-intelligence § 'Grounding the " +
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
import {
|
|
20
20
|
is_ambiguous_stack,
|
|
21
21
|
bundle_line,
|
|
22
|
+
scope_lines,
|
|
22
23
|
unsupported_stack_questions,
|
|
23
24
|
} from './stack_bundles.js';
|
|
24
25
|
|
|
@@ -50,6 +51,29 @@ export const SEVERITY_ORDER: Record<string, number> = {
|
|
|
50
51
|
/** R4 a11y default severity floor. */
|
|
51
52
|
export const DEFAULT_SEVERITY_FLOOR = 'moderate';
|
|
52
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Marker on a review finding that flags a hardcoded design value.
|
|
56
|
+
*
|
|
57
|
+
* Deliberately re-declared rather than imported from `polish.ts`: the two
|
|
58
|
+
* directives are siblings with no dependency edge between them, and
|
|
59
|
+
* `token_violation_kinds_agree` in the Phase 3 test pins the two literals
|
|
60
|
+
* equal so the duplication cannot drift silently.
|
|
61
|
+
*/
|
|
62
|
+
export const TOKEN_VIOLATION_KIND = 'token_violation';
|
|
63
|
+
|
|
64
|
+
/** A finding produced by a deterministic check, not by an agent's judgement. */
|
|
65
|
+
export const DETECTOR_CHANNEL = 'detector';
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* A finding produced by an agent reading the surface.
|
|
69
|
+
*
|
|
70
|
+
* Named here only so the two channels are readable side by side. The prose
|
|
71
|
+
* channel (`tailwind-engineer` § arbitrary values) is unchanged by the
|
|
72
|
+
* detector — the detector is additive, and a finding that carries no
|
|
73
|
+
* `channel` at all predates the split and is treated as judgement.
|
|
74
|
+
*/
|
|
75
|
+
export const JUDGEMENT_CHANNEL = 'judgement';
|
|
76
|
+
|
|
53
77
|
export const AMBIGUITIES: ReadonlyArray<Record<string, string>> = [
|
|
54
78
|
{
|
|
55
79
|
code: 'review_envelope_missing',
|
|
@@ -151,11 +175,15 @@ export function run(state: DeliveryState): StepResult {
|
|
|
151
175
|
return a11y_halt;
|
|
152
176
|
}
|
|
153
177
|
|
|
178
|
+
_apply_token_detector(state, r);
|
|
179
|
+
|
|
154
180
|
const preview_halt = _apply_preview_gate(state, r);
|
|
155
181
|
if (preview_halt !== null) {
|
|
156
182
|
return preview_halt;
|
|
157
183
|
}
|
|
158
184
|
|
|
185
|
+
_stamp_verdict_scope(r);
|
|
186
|
+
|
|
159
187
|
return new StepResult({ outcome: Outcome.SUCCESS });
|
|
160
188
|
}
|
|
161
189
|
|
|
@@ -210,6 +238,7 @@ function _delegate_to_review_skill(state: DeliveryState): StepResult {
|
|
|
210
238
|
`> Stack: \`${stack_label}\`. Reviewing rendered components ` +
|
|
211
239
|
'against the locked design brief.',
|
|
212
240
|
bundle_line(state.stack, 'review', stack_label),
|
|
241
|
+
...scope_lines(state.stack),
|
|
213
242
|
'> The review pass compares `state.ticket.ui_apply.rendered` ' +
|
|
214
243
|
'against `state.ui_design` (microcopy, states, a11y, layout) ' +
|
|
215
244
|
'and produces a structured `findings` list.',
|
|
@@ -372,6 +401,193 @@ function _synthesize_a11y_findings(findings: Any[], actionable: Any[]): void {
|
|
|
372
401
|
}
|
|
373
402
|
}
|
|
374
403
|
|
|
404
|
+
/**
|
|
405
|
+
* Return the audit token category whose bucket holds `value`, or null.
|
|
406
|
+
*
|
|
407
|
+
* This predicate IS the pre-registered scope of the measured dimension: "a raw
|
|
408
|
+
* literal where the audit found a token". A value the audit holds no token for
|
|
409
|
+
* is outside it and is never emitted — the `F4-unscoped` falsifier
|
|
410
|
+
* (`agents/evidence/analysis/frontend-fidelity-preregistered-falsifiers.md`)
|
|
411
|
+
* fires on a detector that flags every literal instead.
|
|
412
|
+
*
|
|
413
|
+
* Membership is tested with `Object.values(bucket).includes(value)`, the exact
|
|
414
|
+
* predicate `polish._classify_token_violations` uses. Sharing the predicate is
|
|
415
|
+
* what makes every detector-produced finding classify as `matched` downstream,
|
|
416
|
+
* so the detector channel can never trip the token-extraction halt.
|
|
417
|
+
*/
|
|
418
|
+
function _audit_token_category(tokens: Record<string, Any>, value: string): string | null {
|
|
419
|
+
for (const category of Object.keys(tokens)) {
|
|
420
|
+
const bucket = tokens[category];
|
|
421
|
+
if (_isDict(bucket) && Object.values(bucket).includes(value)) {
|
|
422
|
+
return category;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/** Return `state.ui_audit.design_tokens` as a dict, or `{}`. */
|
|
429
|
+
function _audit_design_tokens(state: DeliveryState): Record<string, Any> {
|
|
430
|
+
const audit = _pyTruthy(state.ui_audit) ? state.ui_audit : {};
|
|
431
|
+
if (!_isDict(audit)) {
|
|
432
|
+
return {};
|
|
433
|
+
}
|
|
434
|
+
const tokens = _pyTruthy(audit['design_tokens']) ? audit['design_tokens'] : {};
|
|
435
|
+
return _isDict(tokens) ? tokens : {};
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/** Dedup key for a detector finding — one per measured site and value. */
|
|
439
|
+
function _tokenKeyOf(file: Any, line: Any, value: Any): string {
|
|
440
|
+
return `${String(file)}\u0000${String(line)}\u0000${String(value)}`;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* Append `token_violation` findings from the detector envelope.
|
|
445
|
+
*
|
|
446
|
+
* Mirrors `_synthesize_a11y_findings`: the review skill writes the raw scan
|
|
447
|
+
* into `state.ui_review.tokens.violations`, and this turns the in-scope subset
|
|
448
|
+
* into findings the polish gate already knows how to act on. Deduped by
|
|
449
|
+
* `(file, line, value)`, so re-running the step is idempotent.
|
|
450
|
+
*
|
|
451
|
+
* Returns the number of findings appended.
|
|
452
|
+
*/
|
|
453
|
+
function _synthesize_token_findings(
|
|
454
|
+
findings: Any[],
|
|
455
|
+
violations: Any[],
|
|
456
|
+
tokens: Record<string, Any>,
|
|
457
|
+
): number {
|
|
458
|
+
const existing = new Set<string>();
|
|
459
|
+
for (const f of findings) {
|
|
460
|
+
if (_isDict(f) && f['kind'] === TOKEN_VIOLATION_KIND) {
|
|
461
|
+
existing.add(_tokenKeyOf(f['file'], f['line'], f['value']));
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
let added = 0;
|
|
465
|
+
for (const v of violations) {
|
|
466
|
+
if (!_isDict(v)) {
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
const value = v['value'];
|
|
470
|
+
if (typeof value !== 'string') {
|
|
471
|
+
continue;
|
|
472
|
+
}
|
|
473
|
+
const category = _audit_token_category(tokens, value);
|
|
474
|
+
if (category === null) {
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
const key = _tokenKeyOf(v['file'], v['line'], value);
|
|
478
|
+
if (existing.has(key)) {
|
|
479
|
+
continue;
|
|
480
|
+
}
|
|
481
|
+
findings.push({
|
|
482
|
+
kind: TOKEN_VIOLATION_KIND,
|
|
483
|
+
channel: DETECTOR_CHANNEL,
|
|
484
|
+
category,
|
|
485
|
+
value,
|
|
486
|
+
file: v['file'] ?? null,
|
|
487
|
+
line: v['line'] ?? null,
|
|
488
|
+
detector_type: v['type'] ?? null,
|
|
489
|
+
});
|
|
490
|
+
existing.add(key);
|
|
491
|
+
added += 1;
|
|
492
|
+
}
|
|
493
|
+
return added;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Turn the detector envelope into findings, and take the review off clean.
|
|
498
|
+
*
|
|
499
|
+
* Never halts. An absent envelope is not an error: the detector is one channel
|
|
500
|
+
* of two, and a run that did not scan is a run with nothing measured — which is
|
|
501
|
+
* exactly what the `render_ok` gate below refuses to let pass silently for the
|
|
502
|
+
* render channel, and what a null record covers for a blocked dimension.
|
|
503
|
+
*/
|
|
504
|
+
function _apply_token_detector(state: DeliveryState, review: Record<string, Any>): void {
|
|
505
|
+
const raw = review['tokens'];
|
|
506
|
+
if (!_isDict(raw)) {
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
const violations = raw['violations'];
|
|
510
|
+
if (!Array.isArray(violations) || violations.length === 0) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
const findings = review['findings'];
|
|
514
|
+
if (!Array.isArray(findings)) {
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
const added = _synthesize_token_findings(
|
|
518
|
+
findings as Any[],
|
|
519
|
+
violations as Any[],
|
|
520
|
+
_audit_design_tokens(state),
|
|
521
|
+
);
|
|
522
|
+
if (added > 0) {
|
|
523
|
+
review['review_clean'] = false;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Render-dependent checks, and the blocker that gates each of them.
|
|
529
|
+
*
|
|
530
|
+
* Named here so a static-scoped verdict can enumerate what it did NOT do.
|
|
531
|
+
* "Scope the verdict to what was statically checked and say so" is only
|
|
532
|
+
* readable if the unrun half is written down too — an enumerated `checks_run`
|
|
533
|
+
* with no `checks_not_run` beside it reads as a complete review.
|
|
534
|
+
*/
|
|
535
|
+
export const RENDER_DEPENDENT_CHECKS: ReadonlyArray<string> = [
|
|
536
|
+
'viewport-sweep',
|
|
537
|
+
'touch-target-size',
|
|
538
|
+
'rendered-contrast',
|
|
539
|
+
'screenshot-diff',
|
|
540
|
+
];
|
|
541
|
+
|
|
542
|
+
/** The blocker slug every render-dependent check is gated behind. */
|
|
543
|
+
export const RENDER_BLOCKER = 'b-page-capture-primitive';
|
|
544
|
+
|
|
545
|
+
/**
|
|
546
|
+
* Stamp the verdict scope onto the review envelope.
|
|
547
|
+
*
|
|
548
|
+
* W6: `design-review` makes browser automation a hard prerequisite and, below
|
|
549
|
+
* it, describes a static path in prose with no artefact recording which checks
|
|
550
|
+
* actually ran. This writes that artefact.
|
|
551
|
+
*
|
|
552
|
+
* Every field is DERIVED from the envelope — nothing is invented. A check is
|
|
553
|
+
* listed as run because the envelope carries its evidence, never because a
|
|
554
|
+
* skill said it ran. `scope` is always stamped, so an unscoped verdict is not a
|
|
555
|
+
* shape this step can leave behind.
|
|
556
|
+
*/
|
|
557
|
+
function _stamp_verdict_scope(review: Record<string, Any>): void {
|
|
558
|
+
const raw_preview = review['preview'];
|
|
559
|
+
const preview: Record<string, Any> = _isDict(raw_preview) ? raw_preview : {};
|
|
560
|
+
const rendered = preview['render_ok'] === true;
|
|
561
|
+
|
|
562
|
+
const checks_run: string[] = ['findings-review'];
|
|
563
|
+
const a11y = review['a11y'];
|
|
564
|
+
if (_isDict(a11y) && Array.isArray(a11y['violations'])) {
|
|
565
|
+
checks_run.push('a11y-axe');
|
|
566
|
+
}
|
|
567
|
+
const tokens = review['tokens'];
|
|
568
|
+
if (_isDict(tokens) && Array.isArray(tokens['violations'])) {
|
|
569
|
+
checks_run.push('token-detector');
|
|
570
|
+
}
|
|
571
|
+
if (rendered) {
|
|
572
|
+
checks_run.push(...RENDER_DEPENDENT_CHECKS);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
const scope: Record<string, Any> = {
|
|
576
|
+
scope: rendered ? 'render' : 'static',
|
|
577
|
+
render_available: rendered,
|
|
578
|
+
checks_run,
|
|
579
|
+
};
|
|
580
|
+
if (!rendered) {
|
|
581
|
+
scope['checks_not_run'] = [...RENDER_DEPENDENT_CHECKS];
|
|
582
|
+
scope['blocker'] = RENDER_BLOCKER;
|
|
583
|
+
const reason = preview['skip_reason'];
|
|
584
|
+
scope['skip_reason'] = typeof reason === 'string' && reason.length > 0
|
|
585
|
+
? reason
|
|
586
|
+
: RENDER_BLOCKER;
|
|
587
|
+
}
|
|
588
|
+
review['verdict_scope'] = scope;
|
|
589
|
+
}
|
|
590
|
+
|
|
375
591
|
/** BLOCKED halt — audit declared a baseline but review has no a11y. */
|
|
376
592
|
function _halt_a11y_pending(state: DeliveryState): StepResult {
|
|
377
593
|
const directive = _resolve_directive(state);
|