@event4u/agent-config 16.3.0 → 16.5.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 +178 -78
- package/README.md +2 -2
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +10 -7
- package/dist/agent-src/commands/bug/investigate.md +1 -1
- package/dist/agent-src/commands/commit/in-chunks.md +40 -31
- package/dist/agent-src/commands/commit.md +72 -33
- package/dist/agent-src/commands/condense.md +2 -8
- package/dist/agent-src/commands/council/debate.md +11 -7
- package/dist/agent-src/commands/council/default.md +10 -9
- package/dist/agent-src/commands/council.md +1 -1
- package/dist/agent-src/commands/design.md +1 -1
- package/dist/agent-src/commands/estimate-ticket.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +3 -3
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +17 -3
- package/dist/agent-src/commands/fix/commit-messages.md +48 -23
- package/dist/agent-src/commands/fix/pr-comments.md +3 -6
- package/dist/agent-src/commands/implement-ticket.md +3 -3
- package/dist/agent-src/commands/memory/add.md +4 -16
- package/dist/agent-src/commands/memory/load.md +5 -6
- package/dist/agent-src/commands/memory/promote.md +3 -16
- package/dist/agent-src/commands/mission/upgrade.md +3 -2
- package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
- package/dist/agent-src/commands/optimize/deep.md +4 -2
- package/dist/agent-src/commands/optimize/rtk.md +4 -26
- package/dist/agent-src/commands/pr/create/description-only.md +18 -15
- package/dist/agent-src/commands/pr/create.md +42 -34
- package/dist/agent-src/commands/pr/merge.md +136 -9
- package/dist/agent-src/commands/prepare-for-review.md +13 -11
- package/dist/agent-src/commands/project/analyze.md +7 -35
- package/dist/agent-src/commands/refine-ticket.md +1 -1
- package/dist/agent-src/commands/review/changes.md +14 -19
- package/dist/agent-src/commands/roadmap/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +52 -38
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
- package/dist/agent-src/commands/worktree/create.md +7 -3
- package/dist/agent-src/commands/worktree/verify.md +2 -1
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
- package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
- package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
- package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
- package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
- package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
- package/dist/agent-src/guidelines/design-antipatterns.md +1 -1
- package/dist/agent-src/guidelines/php/git.md +15 -2
- package/dist/agent-src/rules/active-remediation.md +0 -1
- package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
- package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
- package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
- package/dist/agent-src/rules/autonomous-execution.md +0 -1
- package/dist/agent-src/rules/brand-consistency.md +0 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
- package/dist/agent-src/rules/broken-access-control.md +0 -1
- package/dist/agent-src/rules/cli-output-handling.md +0 -1
- package/dist/agent-src/rules/code-comment-discipline.md +0 -1
- package/dist/agent-src/rules/code-provenance.md +0 -1
- package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
- package/dist/agent-src/rules/commit-conventions.md +1 -2
- package/dist/agent-src/rules/communication-through-line.md +1 -2
- package/dist/agent-src/rules/content-quoting-floor.md +1 -2
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/copilot-routing.md +1 -2
- package/dist/agent-src/rules/council-availability.md +4 -4
- package/dist/agent-src/rules/cross-source-consistency.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +0 -1
- package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
- package/dist/agent-src/rules/devcontainer-routing.md +1 -2
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
- package/dist/agent-src/rules/docker-commands.md +0 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
- package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
- package/dist/agent-src/rules/domain-safety-pii.md +0 -1
- package/dist/agent-src/rules/domain-safety-retention.md +0 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
- package/dist/agent-src/rules/finance-safety-floor.md +0 -1
- package/dist/agent-src/rules/fix-what-you-see.md +6 -32
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +1 -2
- package/dist/agent-src/rules/guidelines.md +0 -1
- package/dist/agent-src/rules/history-discipline.md +0 -1
- package/dist/agent-src/rules/icon-consistency.md +0 -1
- package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
- package/dist/agent-src/rules/improve-before-implement.md +0 -1
- package/dist/agent-src/rules/invite-challenge.md +0 -1
- package/dist/agent-src/rules/laravel-routing.md +1 -2
- package/dist/agent-src/rules/laravel-translations.md +0 -1
- package/dist/agent-src/rules/legal-safety-floor.md +0 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +1 -2
- package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
- package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/model-recommendation.md +0 -1
- package/dist/agent-src/rules/neighbour-precedence.md +64 -0
- package/dist/agent-src/rules/no-attribution-footers.md +0 -1
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
- package/dist/agent-src/rules/no-roadmap-references.md +0 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
- package/dist/agent-src/rules/onboarding-gate.md +0 -1
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/package-ci-checks.md +0 -1
- package/dist/agent-src/rules/persona-governance.md +2 -3
- package/dist/agent-src/rules/php-coding.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
- package/dist/agent-src/rules/preservation-guard.md +0 -1
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
- package/dist/agent-src/rules/question-not-instruction.md +0 -1
- package/dist/agent-src/rules/reviewer-awareness.md +0 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -1
- package/dist/agent-src/rules/runtime-safety.md +0 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
- package/dist/agent-src/rules/self-repair-loop.md +0 -1
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
- package/dist/agent-src/rules/session-canary.md +0 -1
- package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
- package/dist/agent-src/rules/size-enforcement.md +0 -1
- package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
- package/dist/agent-src/rules/skill-quality.md +0 -1
- package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
- package/dist/agent-src/rules/source-confidentiality.md +0 -1
- package/dist/agent-src/rules/source-discovery-gate.md +0 -1
- package/dist/agent-src/rules/source-of-truth.md +0 -1
- package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
- package/dist/agent-src/rules/symfony-routing.md +1 -2
- package/dist/agent-src/rules/think-before-action.md +0 -1
- package/dist/agent-src/rules/token-budget-discipline.md +14 -48
- package/dist/agent-src/rules/token-efficiency.md +0 -1
- package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
- package/dist/agent-src/rules/tool-safety.md +0 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
- package/dist/agent-src/rules/upstream-proposal.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -1
- package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
- package/dist/agent-src/scripts/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +2 -0
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +3 -3
- package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
- package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/canvas-design/SKILL.md +4 -2
- package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
- package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
- package/dist/agent-src/skills/database/data/manifest.json +2 -2
- package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
- package/dist/agent-src/skills/design-intelligence/references/integration-mapping.md +13 -10
- package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/fe-design/references/design-patterns.md +49 -2
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +9 -0
- package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
- package/dist/agent-src/skills/iconography/SKILL.md +4 -2
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +16 -5
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/logo-generation/SKILL.md +12 -8
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/svg-authoring/SKILL.md +318 -0
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/skills/wireframe/SKILL.md +5 -2
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +46 -129
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/roadmaps.md +6 -1
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/skill.md +1 -1
- package/dist/cli/commands/uiRender.js +201 -4
- package/dist/cli/commands/uiRenderAsset.js +1308 -0
- package/dist/cli/commands/uiRenderAssetCompare.js +752 -0
- package/dist/cli/commands/uiRenderAssetGrid.js +265 -0
- package/dist/cli/commands/uiRenderAssetGrounds.js +323 -0
- package/dist/cli/commands/uiRenderAssetIsolation.js +85 -0
- package/dist/cli/commands/uiRenderAssetTypes.js +145 -0
- package/dist/cli/main.js +47 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli-delegate/check_update_banner.js +195 -119
- package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-4DBG5K7M.js} +5 -5
- package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
- package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
- package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
- package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
- package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-TMWYUOK4.js} +75 -12
- package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
- package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
- package/dist/cli-delegate/cmd_analyze_session.js +223 -43
- package/dist/cli-delegate/cmd_brand_status.js +3 -2
- package/dist/cli-delegate/cmd_conformance.js +489 -238
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +15 -12
- package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
- package/dist/cli-delegate/cmd_explain.js +43 -19
- package/dist/cli-delegate/cmd_export.js +10 -10
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +40 -21
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +4 -3
- package/dist/cli-delegate/cmd_prune.js +10 -10
- package/dist/cli-delegate/cmd_route_audit.js +7 -7
- package/dist/cli-delegate/cmd_route_explain.js +5 -5
- package/dist/cli-delegate/cmd_session_recycle.js +9 -7
- package/dist/cli-delegate/cmd_settings_check.js +54 -7
- package/dist/cli-delegate/cmd_settings_get.js +18 -8
- package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -10
- package/dist/cli-delegate/cmd_uninstall.js +10 -10
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +7 -7
- package/dist/cli-delegate/cmd_validate.js +10 -10
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +2 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +171 -107
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +7 -7
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +41 -22
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +16 -11
- package/dist/hooks/dispatch.js +2520 -1924
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/svg_rules.chunk.cjs +1626 -0
- package/dist/hooks/svg_rules.chunk.cjs.sha256 +1 -0
- package/dist/install/install.mjs +462 -431
- package/dist/install/installThinLayer.js +40 -12
- package/dist/install/installedRuleLinks.js +105 -19
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
- package/dist/mcp/registry-manifest.json +5 -5
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +3063 -2160
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +15 -120
- package/dist/scripts/_lib/compile_time_toggles.js +12 -21
- package/dist/scripts/_lib/git_convention.js +232 -0
- package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
- package/dist/scripts/_lib/installed_layer.js +344 -18
- package/dist/scripts/_lib/package_root.js +68 -0
- package/dist/scripts/_lib/rule_law_section.js +1 -1
- package/dist/scripts/_lib/scan_scope.js +105 -0
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/svg_dom.js +284 -0
- package/dist/scripts/_lib/svg_geometry.js +477 -0
- package/dist/scripts/_lib/svg_motion.js +179 -0
- package/dist/scripts/_lib/svg_rules.js +1337 -0
- package/dist/scripts/_lib/svg_urls.js +67 -0
- package/dist/scripts/_lib/thin_rules.js +80 -3
- package/dist/scripts/lint_svg_asset.js +324 -0
- package/dist/server/app.js +2 -1
- package/dist/server/gitKeysGate.js +105 -0
- package/dist/server/routes/settings.js +67 -8
- package/dist/server/routes/wizard.js +4 -0
- package/dist/server/schemas/settings.js +23 -81
- package/dist/shared/skillRanking.js +30 -4
- package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +72 -1
- package/docs/contracts/settings-classes.md +35 -65
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/docs/guidelines/agent-infra/layered-settings.md +13 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
- package/docs/guidelines/design-antipatterns.md +1 -1
- package/docs/guidelines/php/git.md +15 -2
- package/package.json +4 -3
- package/src/agent-src/scripts/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/src/config/agent-settings.template.yml +79 -312
- package/src/config/agents-paths.yml +16 -0
- package/src/config/assurance-capability-registry.json +7 -3
- package/src/config/ci-local-parity.yml +3 -0
- package/src/config/continuity-surface.json +3 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +19 -6
- package/src/config/gate-coverage.yml +65 -23
- package/src/config/gate-violation-baselines.json +56 -16
- package/src/config/gitignore-block.txt +19 -0
- package/src/config/hook-bundle-budget.json +1 -1
- package/src/config/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +55 -6
- package/src/config/rule-law-ceilings.json +12 -6
- package/src/config/rule-obligations.json +833 -0
- package/src/install/installThinLayer.ts +76 -10
- package/src/install/installedRuleLinks.ts +105 -17
- package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
- package/src/scripts/_cli/cmd_conformance.ts +13 -2
- package/src/scripts/_cli/cmd_doctor.ts +10 -10
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
- package/src/scripts/_cli/cmd_explain.ts +72 -14
- package/src/scripts/_cli/cmd_git_convention.ts +637 -0
- package/src/scripts/_cli/cmd_settings_check.ts +66 -8
- package/src/scripts/_cli/cmd_settings_get.ts +18 -3
- package/src/scripts/_cli/doctor_execution.ts +72 -1
- package/src/scripts/_dispatch.bash +37 -2
- package/src/scripts/_lib/agent_settings.ts +15 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
- package/src/scripts/_lib/git_base_ref.ts +92 -0
- package/src/scripts/_lib/git_convention.ts +291 -0
- package/src/scripts/_lib/git_convention_carrier.ts +389 -0
- package/src/scripts/_lib/git_convention_grammar.ts +246 -0
- package/src/scripts/_lib/git_convention_measure.ts +344 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
- package/src/scripts/_lib/graph_feeder_record.ts +236 -13
- package/src/scripts/_lib/installed_layer.ts +448 -23
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
- package/src/scripts/_lib/ratification_artifact.ts +220 -1
- package/src/scripts/_lib/ratification_subject.ts +92 -0
- package/src/scripts/_lib/release_findings_ingest.ts +15 -7
- package/src/scripts/_lib/release_highlights.ts +5 -0
- package/src/scripts/_lib/rule_law_section.ts +1 -1
- package/src/scripts/_lib/rule_obligations.ts +205 -0
- package/src/scripts/_lib/self_repair.ts +1 -1
- package/src/scripts/_lib/settings_removed_keys.ts +173 -0
- package/src/scripts/_lib/svg_dom.ts +318 -0
- package/src/scripts/_lib/svg_geometry.ts +480 -0
- package/src/scripts/_lib/svg_motion.ts +208 -0
- package/src/scripts/_lib/svg_rules.ts +1453 -0
- package/src/scripts/_lib/svg_urls.ts +72 -0
- package/src/scripts/_lib/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +83 -3
- package/src/scripts/_lib/touched_file_quality.ts +142 -6
- package/src/scripts/_lib/verification_command.ts +59 -0
- package/src/scripts/_lib/verify_clause.ts +27 -17
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- package/src/scripts/ai_council/config.ts +7 -7
- package/src/scripts/ai_council/modification_review.ts +100 -0
- package/src/scripts/ai_council/modification_review_questions.ts +90 -0
- package/src/scripts/ai_council/orchestrator.ts +5 -5
- package/src/scripts/ai_council/spend_gate.ts +18 -7
- package/src/scripts/ai_team/config.ts +11 -16
- package/src/scripts/audit_user_type_axis.ts +20 -8
- package/src/scripts/bench_ab_clone.ts +1 -2
- package/src/scripts/bench_concern_spawn_path.ts +129 -0
- package/src/scripts/bench_graph_feeder_latency.ts +584 -0
- package/src/scripts/check_agent_artifact_location.ts +36 -0
- package/src/scripts/check_branch_freshness.ts +147 -24
- package/src/scripts/check_enforcement_coverage.ts +130 -0
- package/src/scripts/check_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +88 -25
- package/src/scripts/check_gate_coverage.ts +4 -3
- package/src/scripts/check_gate_reachability.ts +48 -1
- package/src/scripts/check_generator_sync.ts +48 -0
- package/src/scripts/check_hook_bundle_composition.ts +107 -0
- package/src/scripts/check_kernel_edit_ratified.ts +86 -6
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_standing_rule_delivery.ts +96 -0
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- package/src/scripts/ci_settle.ts +42 -5
- package/src/scripts/classify_merge_risk.ts +320 -0
- package/src/scripts/closure_scan.ts +91 -1
- package/src/scripts/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- package/src/scripts/consumer_matrix.ts +102 -0
- package/src/scripts/context_hygiene_hook.ts +13 -23
- package/src/scripts/cost/preflight.mjs +12 -1
- package/src/scripts/council_cli.ts +7 -7
- package/src/scripts/dispatch_r2_reviewer.ts +24 -11
- package/src/scripts/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +20 -3
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +25 -6
- package/src/scripts/hooks/block_config_weakening.ts +48 -5
- package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
- package/src/scripts/hooks/block_speaking_inbox_dir.ts +16 -1
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/design_pass_hook.ts +157 -3
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
- package/src/scripts/hooks/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +44 -3
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/svg_obligation.ts +497 -0
- package/src/scripts/hooks/svg_rules_loader.ts +133 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
- package/src/scripts/hooks/turn_end_gate_hook.ts +6 -3
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +7 -31
- package/src/scripts/lint_blocker_citations.ts +198 -0
- package/src/scripts/lint_consolidation_lineage.ts +6 -3
- package/src/scripts/lint_design_quality.ts +60 -12
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- package/src/scripts/lint_motion_authority_drift.ts +27 -0
- package/src/scripts/lint_pack_boundaries.ts +406 -28
- package/src/scripts/lint_roadmap_blockers.ts +282 -29
- package/src/scripts/lint_roadmap_complexity.ts +4 -2
- package/src/scripts/lint_rule_law_section.ts +151 -21
- package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
- package/src/scripts/lint_settings_classes.ts +1 -1
- package/src/scripts/lint_svg_asset.ts +365 -0
- package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
- package/src/scripts/lint_workflow_security.ts +12 -1
- package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
- package/src/scripts/model_rule_injection.ts +3 -3
- package/src/scripts/onboarding_gate_hook.ts +7 -6
- package/src/scripts/print_required_checks.ts +15 -3
- package/src/scripts/probe_host_compliance.ts +33 -5
- package/src/scripts/probe_turnaround.ts +183 -3
- package/src/scripts/ratification_header.ts +77 -0
- package/src/scripts/refusal_envelope.ts +138 -0
- package/src/scripts/release_publication.ts +29 -3
- package/src/scripts/report_dispatch_import_closure.ts +76 -0
- package/src/scripts/report_installed_rule_links.ts +118 -1
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +16 -18
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_skill_ranker_confusion.ts +103 -2
- package/src/scripts/report_standing_payload_by_host.ts +1 -1
- package/src/scripts/routing_doctor.ts +2 -2
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +39 -2
- package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -16
- package/src/server/schemas/settings.ts +33 -177
- package/src/shared/skillRanking.ts +53 -4
- package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
- package/src/scripts/_lib/config_chain.ts +0 -477
- package/src/scripts/_lib/conformance_report.ts +0 -403
- package/src/scripts/_lib/eval_discrimination.ts +0 -95
- package/src/scripts/_lib/evaluator_promotion.ts +0 -225
- package/src/scripts/_lib/file_slicer.ts +0 -117
- package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
- package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
- package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
- package/src/scripts/_lib/role_split.ts +0 -338
|
@@ -1,403 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-dimension conformance of a port against the artifact it was ported from.
|
|
3
|
-
*
|
|
4
|
-
* WHY A DIMENSION REPORT AND NOT A SCORE. `internal/bench/ui` already scores a
|
|
5
|
-
* port on pixel / dom / tokens / interactions and produces one weighted number.
|
|
6
|
-
* A number answers "how close", which is the right question for a benchmark and
|
|
7
|
-
* the wrong one for a fidelity gate: a port can be pixel-identical and still
|
|
8
|
-
* have dropped a keyboard interaction, inlined every value the project has a
|
|
9
|
-
* token for, or lost a breakpoint. Averaged into a weighted score those
|
|
10
|
-
* disappear, because the axis that carries them is small and the axis that
|
|
11
|
-
* hides them is large.
|
|
12
|
-
*
|
|
13
|
-
* A GREEN PIXEL DIFF ALONE CANNOT PRODUCE A PASS, and that is enforced by
|
|
14
|
-
* construction rather than by policy: pixel similarity is not one of the
|
|
15
|
-
* dimensions below. It is evidence a human may read; it is never an input to
|
|
16
|
-
* `overall`.
|
|
17
|
-
*
|
|
18
|
-
* WHAT EACH ROW OWES. Every finding cites BOTH sides — what the artifact has
|
|
19
|
-
* and what the implementation has. A finding that names only the implementation
|
|
20
|
-
* is unactionable: the reader cannot tell whether the port dropped something or
|
|
21
|
-
* whether the artifact never had it.
|
|
22
|
-
*
|
|
23
|
-
* SCOPE, stated because the honest version is narrower than the obvious one.
|
|
24
|
-
* These are static checks over two documents' text. They catch the deviations
|
|
25
|
-
* that leave a textual trace — a value gone, a handler gone, a breakpoint gone.
|
|
26
|
-
* They do NOT catch a deviation that is only visible when rendered, and they do
|
|
27
|
-
* not claim to. Where a rendered comparison is available it belongs beside this
|
|
28
|
-
* report, not inside it.
|
|
29
|
-
*/
|
|
30
|
-
import { type TokenCandidate, type ValueKind, type ValueRow, reconcileValue } from './design_tolerance.js';
|
|
31
|
-
import { recordToleranceShadow } from './tolerance_shadow.js';
|
|
32
|
-
|
|
33
|
-
export type Dimension = 'structure' | 'values' | 'behaviour' | 'responsive' | 'icons' | 'carrier';
|
|
34
|
-
|
|
35
|
-
export const DIMENSIONS: readonly Dimension[] = [
|
|
36
|
-
'structure',
|
|
37
|
-
'values',
|
|
38
|
-
'behaviour',
|
|
39
|
-
'responsive',
|
|
40
|
-
'icons',
|
|
41
|
-
'carrier',
|
|
42
|
-
];
|
|
43
|
-
|
|
44
|
-
export interface Finding {
|
|
45
|
-
dimension: Dimension;
|
|
46
|
-
/** What the artifact carries. Never omitted — see the header. */
|
|
47
|
-
artifact: string;
|
|
48
|
-
/** What the implementation carries in its place. */
|
|
49
|
-
implementation: string;
|
|
50
|
-
detail: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface DimensionVerdict {
|
|
54
|
-
dimension: Dimension;
|
|
55
|
-
verdict: 'conforms' | 'deviates';
|
|
56
|
-
findings: Finding[];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export interface ConformanceReport {
|
|
60
|
-
dimensions: DimensionVerdict[];
|
|
61
|
-
/** Value rows with their distance, reported whether or not they deviate. */
|
|
62
|
-
values: ValueRow[];
|
|
63
|
-
overall: 'conforms' | 'deviates';
|
|
64
|
-
/** Dimensions that deviated, in `DIMENSIONS` order. */
|
|
65
|
-
deviating: Dimension[];
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// ------------------------------------------------------------- extraction
|
|
69
|
-
|
|
70
|
-
const HEX_RE = /#[0-9a-fA-F]{3}\b|#[0-9a-fA-F]{6}\b/g;
|
|
71
|
-
const LENGTH_RE = /\b\d*\.?\d+(?:px|rem)\b/g;
|
|
72
|
-
const TAG_RE = /<([a-zA-Z][a-zA-Z0-9-]*)\b/g;
|
|
73
|
-
// EVERY width bound in a query, not the first. `@media (min-width: 48rem) and
|
|
74
|
-
// (max-width: 80rem)` has two, and capturing one left `80rem` counted as a
|
|
75
|
-
// VALUE — which reds two dimensions for one corruption and breaks the
|
|
76
|
-
// one-dimension property 4.1's verify clause rests on. Found by a blind review.
|
|
77
|
-
const MEDIA_QUERY_RE = /@media[^{]+/g;
|
|
78
|
-
const MEDIA_BOUND_RE = /\(\s*(?:min|max)-width\s*:\s*([^)]+)\)/g;
|
|
79
|
-
// Case-insensitive on the listener name: the first version required an
|
|
80
|
-
// all-lowercase quoted name, so `addEventListener('DOMContentLoaded', …)` and
|
|
81
|
-
// any camelCase custom event were invisible to the behavior dimension that
|
|
82
|
-
// exists to catch a dropped interaction. Blind-review finding.
|
|
83
|
-
const LISTENER_RE = /addEventListener\(\s*['"]([A-Za-z][A-Za-z0-9_:.-]*)['"]/g;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* `on*` ATTRIBUTES, matched against a closed set rather than by shape.
|
|
87
|
-
*
|
|
88
|
-
* A word boundary does not separate `onclick` from `onboarding` — both begin
|
|
89
|
-
* with `on` and both are followed by `=`, so a shape rule reads the second as a
|
|
90
|
-
* hook named `boarding`. It is the inline-handler namespace that is closed, so
|
|
91
|
-
* the set is what discriminates. A custom event never appears as an attribute
|
|
92
|
-
* anyway; it appears in `addEventListener`, which the regex above reads openly.
|
|
93
|
-
*/
|
|
94
|
-
const INLINE_EVENTS = new Set([
|
|
95
|
-
'click', 'dblclick', 'mousedown', 'mouseup', 'mouseenter', 'mouseleave',
|
|
96
|
-
'mousemove', 'mouseover', 'mouseout', 'keydown', 'keyup', 'keypress',
|
|
97
|
-
'input', 'change', 'submit', 'reset', 'focus', 'blur', 'focusin',
|
|
98
|
-
'focusout', 'scroll', 'wheel', 'load', 'error', 'resize', 'toggle',
|
|
99
|
-
'select', 'drag', 'dragstart', 'dragend', 'dragover', 'drop', 'touchstart',
|
|
100
|
-
'touchend', 'touchmove', 'pointerdown', 'pointerup', 'pointermove',
|
|
101
|
-
'animationend', 'transitionend', 'contextmenu', 'copy', 'cut', 'paste',
|
|
102
|
-
'invalid', 'play', 'pause', 'ended',
|
|
103
|
-
]);
|
|
104
|
-
const ON_ATTR_RE = /(?:^|[\s"'`<])on([a-z]+)\s*=/g;
|
|
105
|
-
// Attribute-bounded and quote-agnostic. Unbounded, it false-positived on any
|
|
106
|
-
// attribute ENDING in `style` (`data-style=`, `hover-style=`); double-quote-only,
|
|
107
|
-
// it missed `style='…'` entirely. Blind-review finding.
|
|
108
|
-
const INLINE_STYLE_RE = /(?:^|[\s"'`<])style\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
|
|
109
|
-
|
|
110
|
-
/** Landmark and control tags — the structural skeleton, not every `<div>`. */
|
|
111
|
-
const STRUCTURAL_TAGS = new Set([
|
|
112
|
-
'main',
|
|
113
|
-
'header',
|
|
114
|
-
'footer',
|
|
115
|
-
'nav',
|
|
116
|
-
'aside',
|
|
117
|
-
'section',
|
|
118
|
-
'article',
|
|
119
|
-
'form',
|
|
120
|
-
'table',
|
|
121
|
-
'dialog',
|
|
122
|
-
'button',
|
|
123
|
-
'input',
|
|
124
|
-
'select',
|
|
125
|
-
'textarea',
|
|
126
|
-
'a',
|
|
127
|
-
'label',
|
|
128
|
-
'svg',
|
|
129
|
-
]);
|
|
130
|
-
|
|
131
|
-
function setMinus(a: Set<string>, b: Set<string>): Set<string> {
|
|
132
|
-
const out = new Set<string>();
|
|
133
|
-
for (const v of a) if (!b.has(v)) out.add(v);
|
|
134
|
-
return out;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function matchSet(text: string, re: RegExp, group = 0): Set<string> {
|
|
138
|
-
const out = new Set<string>();
|
|
139
|
-
for (const m of text.matchAll(re)) {
|
|
140
|
-
const v = m[group];
|
|
141
|
-
if (typeof v === 'string' && v !== '') out.add(v.toLowerCase().trim());
|
|
142
|
-
}
|
|
143
|
-
return out;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/** Counts per structural tag; a dropped control is a count change, not absence. */
|
|
147
|
-
export function structuralCounts(html: string): Map<string, number> {
|
|
148
|
-
const counts = new Map<string, number>();
|
|
149
|
-
for (const m of html.matchAll(TAG_RE)) {
|
|
150
|
-
const tag = (m[1] as string).toLowerCase();
|
|
151
|
-
if (!STRUCTURAL_TAGS.has(tag)) continue;
|
|
152
|
-
counts.set(tag, (counts.get(tag) ?? 0) + 1);
|
|
153
|
-
}
|
|
154
|
-
return counts;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/** Event names the document wires, from listeners and from `on*` attributes. */
|
|
158
|
-
export function behaviourHooks(html: string): Set<string> {
|
|
159
|
-
const out = new Set<string>();
|
|
160
|
-
for (const m of html.matchAll(LISTENER_RE)) {
|
|
161
|
-
out.add((m[1] as string).toLowerCase());
|
|
162
|
-
}
|
|
163
|
-
for (const m of html.matchAll(ON_ATTR_RE)) {
|
|
164
|
-
const name = (m[1] as string).toLowerCase();
|
|
165
|
-
if (INLINE_EVENTS.has(name)) out.add(name);
|
|
166
|
-
}
|
|
167
|
-
return out;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/** Breakpoints, normalised so `48rem` and `48 rem` are one value. */
|
|
171
|
-
export function breakpoints(html: string): Set<string> {
|
|
172
|
-
const out = new Set<string>();
|
|
173
|
-
for (const q of html.matchAll(MEDIA_QUERY_RE)) {
|
|
174
|
-
for (const b of (q[0] as string).matchAll(MEDIA_BOUND_RE)) {
|
|
175
|
-
const v = (b[1] as string).toLowerCase().trim();
|
|
176
|
-
if (v !== '') out.add(v);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
return out;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Static declarations sitting in a `style=` attribute.
|
|
184
|
-
*
|
|
185
|
-
* The carrier axis: static presentation belongs in CSS or classes, and `style=`
|
|
186
|
-
* is for what only the runtime knows. A port that moves the artifact's inline
|
|
187
|
-
* styles into classes is CONFORMING as long as the resolved value is identical
|
|
188
|
-
* — which is why this counts declarations the IMPLEMENTATION added, never ones
|
|
189
|
-
* it removed.
|
|
190
|
-
*/
|
|
191
|
-
export function inlineStaticDeclarations(html: string): string[] {
|
|
192
|
-
const out: string[] = [];
|
|
193
|
-
for (const m of html.matchAll(INLINE_STYLE_RE)) {
|
|
194
|
-
for (const decl of ((m[1] ?? m[2] ?? '') as string).split(';')) {
|
|
195
|
-
const trimmed = decl.trim();
|
|
196
|
-
if (trimmed === '') continue;
|
|
197
|
-
// A custom property or a `var()` is plausibly runtime-driven.
|
|
198
|
-
if (trimmed.startsWith('--') || trimmed.includes('var(')) continue;
|
|
199
|
-
out.push(trimmed.toLowerCase());
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return out;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/** Inline `<svg>` occurrences — the icon carrier a port reproduces. */
|
|
206
|
-
export function inlineSvgCount(html: string): number {
|
|
207
|
-
return (html.match(/<svg\b/gi) ?? []).length;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// ------------------------------------------------------------------ report
|
|
211
|
-
|
|
212
|
-
function verdictFor(dimension: Dimension, findings: Finding[]): DimensionVerdict {
|
|
213
|
-
return { dimension, verdict: findings.length > 0 ? 'deviates' : 'conforms', findings };
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
export interface ReportInput {
|
|
217
|
-
artifact: string;
|
|
218
|
-
implementation: string;
|
|
219
|
-
/** Project tokens, so a value row can carry its distance. */
|
|
220
|
-
tokens?: readonly TokenCandidate[];
|
|
221
|
-
/**
|
|
222
|
-
* Repo root. When given, every measurable value row is appended to the
|
|
223
|
-
* shadow log as a `tolerance_shadow` record.
|
|
224
|
-
*
|
|
225
|
-
* OPT-IN, and that is the whole design: a report is also built by tests and
|
|
226
|
-
* by a reader inspecting a port, and a window that recorded those would be
|
|
227
|
-
* measuring its own test fixtures. The caller that wants the window says so.
|
|
228
|
-
*/
|
|
229
|
-
shadowRoot?: string;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Build the report. Pure over two strings, so a test can corrupt exactly one
|
|
234
|
-
* dimension and assert that exactly one reds.
|
|
235
|
-
*/
|
|
236
|
-
export function buildConformanceReport(input: ReportInput): ConformanceReport {
|
|
237
|
-
const { artifact, implementation } = input;
|
|
238
|
-
const tokens = input.tokens ?? [];
|
|
239
|
-
|
|
240
|
-
// --- structure
|
|
241
|
-
const structureFindings: Finding[] = [];
|
|
242
|
-
const aCounts = structuralCounts(artifact);
|
|
243
|
-
const iCounts = structuralCounts(implementation);
|
|
244
|
-
for (const tag of new Set([...aCounts.keys(), ...iCounts.keys()])) {
|
|
245
|
-
const a = aCounts.get(tag) ?? 0;
|
|
246
|
-
const i = iCounts.get(tag) ?? 0;
|
|
247
|
-
// `svg` is the icons dimension's subject; counting it here too would
|
|
248
|
-
// red two dimensions for one corruption and break the step's verify.
|
|
249
|
-
if (tag === 'svg' || a === i) continue;
|
|
250
|
-
structureFindings.push({
|
|
251
|
-
dimension: 'structure',
|
|
252
|
-
artifact: `${String(a)} × <${tag}>`,
|
|
253
|
-
implementation: `${String(i)} × <${tag}>`,
|
|
254
|
-
detail: `structural element count differs for <${tag}>`,
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// --- values, and their distances
|
|
259
|
-
const aHex = matchSet(artifact, HEX_RE);
|
|
260
|
-
const iHex = matchSet(implementation, HEX_RE);
|
|
261
|
-
// A breakpoint's own length belongs to `responsive`, not to `values`.
|
|
262
|
-
// Without this both axes red on one corruption — measured: dropping
|
|
263
|
-
// `@media (min-width: 48rem)` also dropped `48rem` from the value set, so
|
|
264
|
-
// the responsive case reported `['values', 'responsive']` and the step's
|
|
265
|
-
// "and no other" clause could not hold. Same shape as the `svg` exclusion
|
|
266
|
-
// in the structure loop above.
|
|
267
|
-
const aLen = setMinus(matchSet(artifact, LENGTH_RE), breakpoints(artifact));
|
|
268
|
-
const iLen = setMinus(matchSet(implementation, LENGTH_RE), breakpoints(implementation));
|
|
269
|
-
const valueFindings: Finding[] = [];
|
|
270
|
-
const valueRows: ValueRow[] = [];
|
|
271
|
-
// Parallel to `valueRows`: a row does not carry its own kind, and the
|
|
272
|
-
// shadow record needs it to pick the right candidate-threshold spread.
|
|
273
|
-
const valueKinds: ValueKind[] = [];
|
|
274
|
-
|
|
275
|
-
for (const hex of aHex) {
|
|
276
|
-
// Reported on every value, present or missing — the distance is the
|
|
277
|
-
// point, not the verdict (`design_tolerance.ts` header).
|
|
278
|
-
valueRows.push(reconcileValue('color', hex, tokens));
|
|
279
|
-
valueKinds.push('color');
|
|
280
|
-
if (!iHex.has(hex)) {
|
|
281
|
-
valueFindings.push({
|
|
282
|
-
dimension: 'values',
|
|
283
|
-
artifact: hex,
|
|
284
|
-
implementation: iHex.size > 0 ? `absent (port uses ${[...iHex].join(', ')})` : 'absent',
|
|
285
|
-
detail: 'a colour the artifact states does not appear in the port',
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
for (const len of aLen) {
|
|
290
|
-
valueRows.push(reconcileValue('length', len, tokens));
|
|
291
|
-
valueKinds.push('length');
|
|
292
|
-
if (!iLen.has(len)) {
|
|
293
|
-
valueFindings.push({
|
|
294
|
-
dimension: 'values',
|
|
295
|
-
artifact: len,
|
|
296
|
-
implementation: 'absent',
|
|
297
|
-
detail: 'a length the artifact states does not appear in the port',
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
// --- behaviour
|
|
303
|
-
const aHooks = behaviourHooks(artifact);
|
|
304
|
-
const iHooks = behaviourHooks(implementation);
|
|
305
|
-
const behaviourFindings: Finding[] = [];
|
|
306
|
-
for (const hook of aHooks) {
|
|
307
|
-
if (iHooks.has(hook)) continue;
|
|
308
|
-
behaviourFindings.push({
|
|
309
|
-
dimension: 'behaviour',
|
|
310
|
-
artifact: `wires \`${hook}\``,
|
|
311
|
-
implementation: 'not wired',
|
|
312
|
-
detail: `an interaction the artifact wires is missing from the port`,
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// --- responsive
|
|
317
|
-
const aBp = breakpoints(artifact);
|
|
318
|
-
const iBp = breakpoints(implementation);
|
|
319
|
-
const responsiveFindings: Finding[] = [];
|
|
320
|
-
for (const bp of aBp) {
|
|
321
|
-
if (iBp.has(bp)) continue;
|
|
322
|
-
responsiveFindings.push({
|
|
323
|
-
dimension: 'responsive',
|
|
324
|
-
artifact: `breakpoint ${bp}`,
|
|
325
|
-
implementation: iBp.size > 0 ? `only ${[...iBp].join(', ')}` : 'no breakpoints',
|
|
326
|
-
detail: 'a breakpoint the artifact declares is missing from the port',
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
// --- icons
|
|
331
|
-
const aSvg = inlineSvgCount(artifact);
|
|
332
|
-
const iSvg = inlineSvgCount(implementation);
|
|
333
|
-
const iconFindings: Finding[] = [];
|
|
334
|
-
if (aSvg !== iSvg) {
|
|
335
|
-
iconFindings.push({
|
|
336
|
-
dimension: 'icons',
|
|
337
|
-
artifact: `${String(aSvg)} inline <svg>`,
|
|
338
|
-
implementation: `${String(iSvg)} inline <svg>`,
|
|
339
|
-
detail: 'the port does not carry the artifact’s icon count',
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
// --- carrier
|
|
344
|
-
const aInline = new Set(inlineStaticDeclarations(artifact));
|
|
345
|
-
const carrierFindings: Finding[] = [];
|
|
346
|
-
for (const decl of inlineStaticDeclarations(implementation)) {
|
|
347
|
-
if (aInline.has(decl)) continue;
|
|
348
|
-
carrierFindings.push({
|
|
349
|
-
dimension: 'carrier',
|
|
350
|
-
artifact: 'not inline in the artifact',
|
|
351
|
-
implementation: `style="${decl}"`,
|
|
352
|
-
detail: 'a static declaration the port put inline; static presentation belongs in a class',
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
const dimensions: DimensionVerdict[] = [
|
|
357
|
-
verdictFor('structure', structureFindings),
|
|
358
|
-
verdictFor('values', valueFindings),
|
|
359
|
-
verdictFor('behaviour', behaviourFindings),
|
|
360
|
-
verdictFor('responsive', responsiveFindings),
|
|
361
|
-
verdictFor('icons', iconFindings),
|
|
362
|
-
verdictFor('carrier', carrierFindings),
|
|
363
|
-
];
|
|
364
|
-
const deviating = dimensions.filter((d) => d.verdict === 'deviates').map((d) => d.dimension);
|
|
365
|
-
|
|
366
|
-
// The one place the shadow window is fed. Without this the records the
|
|
367
|
-
// flip criterion is meant to read never exist, and its reverse trigger is
|
|
368
|
-
// satisfied by construction — the defect a blind review caught on the
|
|
369
|
-
// branch that introduced the module.
|
|
370
|
-
if (input.shadowRoot !== undefined) {
|
|
371
|
-
recordToleranceShadow(
|
|
372
|
-
input.shadowRoot,
|
|
373
|
-
valueRows.map((row, i) => ({ kind: valueKinds[i] as ValueKind, row })),
|
|
374
|
-
);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
return {
|
|
378
|
-
dimensions,
|
|
379
|
-
values: valueRows,
|
|
380
|
-
overall: deviating.length > 0 ? 'deviates' : 'conforms',
|
|
381
|
-
deviating,
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/** One line per dimension, then the value rows with their distances. */
|
|
386
|
-
export function formatConformanceReport(report: ConformanceReport): string {
|
|
387
|
-
const lines: string[] = [];
|
|
388
|
-
for (const d of report.dimensions) {
|
|
389
|
-
const mark = d.verdict === 'conforms' ? '✅' : '❌';
|
|
390
|
-
lines.push(`${mark} ${d.dimension}: ${d.verdict} (${String(d.findings.length)} finding(s))`);
|
|
391
|
-
for (const f of d.findings) {
|
|
392
|
-
lines.push(` artifact: ${f.artifact} · port: ${f.implementation} — ${f.detail}`);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
lines.push(
|
|
396
|
-
`\noverall: ${report.overall}` +
|
|
397
|
-
(report.deviating.length > 0 ? ` (${report.deviating.join(', ')})` : ''),
|
|
398
|
-
);
|
|
399
|
-
// Stated on every report, not only on a failing one: a reader who sees a
|
|
400
|
-
// pass has to know what it did NOT measure.
|
|
401
|
-
lines.push('pixel similarity is not a dimension here and cannot produce a pass on its own.');
|
|
402
|
-
return lines.join('\n');
|
|
403
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* eval_discrimination — the "falsifier of the falsifier" for the cross-model
|
|
3
|
-
* parity smoke (roadmap `road-to-operator-runtime-harvest`, T-003).
|
|
4
|
-
*
|
|
5
|
-
* A green parity result is trustworthy only if the eval *can* go red — and not
|
|
6
|
-
* just on a gross violation, but on a subtle, just-over-threshold one. A gross
|
|
7
|
-
* negative control proves "the harness can fail"; the SUBTLE control proves it
|
|
8
|
-
* is sensitive enough that an "all hosts pass" reading (outcome (a) in T-006)
|
|
9
|
-
* is not the underpowered-null trap wearing a green check. `discrimination_ok`
|
|
10
|
-
* is therefore gated on the SUBTLE control being caught — a gross-only control
|
|
11
|
-
* set is explicitly insufficient.
|
|
12
|
-
*
|
|
13
|
-
* Pure, dependency-free, host-agnostic: the smoke computes each control's
|
|
14
|
-
* `caught` from its assertion results (via `controlCaughtFromAssertions`) and
|
|
15
|
-
* passes the set here. No vendor calls happen in this module.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
export type ControlSeverity = 'gross' | 'subtle';
|
|
19
|
-
|
|
20
|
-
export interface NegativeControl {
|
|
21
|
-
/** Stable id of the planted-violation control scenario. */
|
|
22
|
-
id: string;
|
|
23
|
-
/** How blatant the planted RDP violation is. */
|
|
24
|
-
severity: ControlSeverity;
|
|
25
|
-
/**
|
|
26
|
-
* Did the harness flag this control (grade it RED)? A control is "caught"
|
|
27
|
-
* when NOT all of its assertions passed — i.e. the harness correctly
|
|
28
|
-
* detected the planted violation. Caught is the *desired* outcome.
|
|
29
|
-
*/
|
|
30
|
-
caught: boolean;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface DiscriminationResult {
|
|
34
|
-
/**
|
|
35
|
-
* True only when the harness caught the SUBTLE control (and a gross one
|
|
36
|
-
* exists and was also caught). This is the strict gate the parity smoke
|
|
37
|
-
* checks before trusting an "all hosts pass" reading.
|
|
38
|
-
*/
|
|
39
|
-
discrimination_ok: boolean;
|
|
40
|
-
gross_caught: boolean;
|
|
41
|
-
subtle_caught: boolean;
|
|
42
|
-
/** Human-readable reason, surfaced in the smoke's emitted summary. */
|
|
43
|
-
reason: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* A control is "caught" iff at least one of its assertions explicitly failed.
|
|
48
|
-
* `pass: null` (e.g. an ungraded `rubric` assertion deferred to a sub-agent
|
|
49
|
-
* grader) is NOT a fail — an un-graded assertion cannot count as catching a
|
|
50
|
-
* violation, so only explicit `false` qualifies.
|
|
51
|
-
*/
|
|
52
|
-
export function controlCaughtFromAssertions(
|
|
53
|
-
assertionResults: ReadonlyArray<{ pass: boolean | null }>,
|
|
54
|
-
): boolean {
|
|
55
|
-
return assertionResults.some((r) => r.pass === false);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Decide whether the eval discriminates well enough to trust a green reading.
|
|
60
|
-
* Requires at least one `gross` AND one `subtle` control; gates on the subtle.
|
|
61
|
-
*/
|
|
62
|
-
export function computeDiscrimination(
|
|
63
|
-
controls: ReadonlyArray<NegativeControl>,
|
|
64
|
-
): DiscriminationResult {
|
|
65
|
-
const gross = controls.filter((c) => c.severity === 'gross');
|
|
66
|
-
const subtle = controls.filter((c) => c.severity === 'subtle');
|
|
67
|
-
|
|
68
|
-
const gross_caught = gross.length > 0 && gross.every((c) => c.caught);
|
|
69
|
-
const subtle_caught = subtle.length > 0 && subtle.every((c) => c.caught);
|
|
70
|
-
|
|
71
|
-
let discrimination_ok = false;
|
|
72
|
-
let reason: string;
|
|
73
|
-
|
|
74
|
-
if (gross.length === 0 || subtle.length === 0) {
|
|
75
|
-
reason =
|
|
76
|
-
'GRADED control set incomplete: need at least one `gross` and one `subtle` ' +
|
|
77
|
-
'negative control. A single severity cannot establish sensitivity — outcome (a) stays invalid.';
|
|
78
|
-
} else if (!gross_caught) {
|
|
79
|
-
reason =
|
|
80
|
-
'Harness is blind to a GROSS violation — it cannot fail at all. ' +
|
|
81
|
-
'Any "all hosts pass" reading is meaningless.';
|
|
82
|
-
} else if (!subtle_caught) {
|
|
83
|
-
reason =
|
|
84
|
-
'Underpowered: the gross control was caught but the SUBTLE one slipped through. ' +
|
|
85
|
-
'This is the uninformative-null trap with a green check in front — outcome (a) is ' +
|
|
86
|
-
'INVALID until the subtle control is caught.';
|
|
87
|
-
} else {
|
|
88
|
-
discrimination_ok = true;
|
|
89
|
-
reason =
|
|
90
|
-
'Both gross and subtle negative controls were caught — the eval discriminates; ' +
|
|
91
|
-
'an "all hosts pass" reading is trustworthy.';
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return { discrimination_ok, gross_caught, subtle_caught, reason };
|
|
95
|
-
}
|