lazycodex-ai 5.1.44 → 5.1.46
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/README.de.md +0 -5
- package/README.es.md +0 -5
- package/README.fr.md +0 -5
- package/README.it.md +0 -5
- package/README.ja.md +0 -5
- package/README.ko.md +0 -5
- package/README.md +4 -5
- package/README.pt-br.md +0 -5
- package/README.ru.md +0 -6
- package/README.zh-cn.md +0 -5
- package/dist/cli/index.js +865 -413
- package/dist/cli/service-auth/keystore.d.ts +4 -2
- package/dist/cli-node/index.js +865 -413
- package/docs/reference/web-terminal-visual-qa.md +8 -0
- package/package.json +1 -1
- package/packages/lsp-daemon/dist/cli.js +7 -7
- package/packages/lsp-daemon/dist/client.js +7 -7
- package/packages/lsp-daemon/dist/index.js +7 -7
- package/packages/lsp-daemon/package.json +3 -3
- package/packages/lsp-tools-mcp/dist/cli.js +7 -7
- package/packages/lsp-tools-mcp/dist/mcp.js +7 -7
- package/packages/lsp-tools-mcp/dist/tools.js +4 -4
- package/packages/lsp-tools-mcp/package.json +3 -3
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +77 -26
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/biome.json +1 -21
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +4 -4
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/biome.json +1 -21
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/biome.json +1 -21
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +4 -4
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +4 -4
- package/packages/omo-codex/plugin/components/lsp/scripts/build-runtime.mjs +0 -1
- package/packages/omo-codex/plugin/components/lsp/test/codex-hook-not-installed.test.ts +1 -1
- package/packages/omo-codex/plugin/components/rules/biome.json +1 -21
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +4 -4
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/biome.json +1 -21
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +90 -1
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +91 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/biome.json +1 -21
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/biome.json +1 -21
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +1 -21
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +7 -7
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/commit-mutations.mjs +2 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +14 -9
- package/packages/omo-codex/plugin/skills/ast-grep/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/skills/browser/SKILL.md +21 -22
- package/packages/omo-codex/plugin/skills/browser/references/commands.md +2 -9
- package/packages/omo-codex/plugin/skills/browser/references/install.md +1 -2
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +2 -2
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-engine-guard.mjs +63 -487
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +1 -1
- package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +1 -10
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +2 -2
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +79 -118
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +75 -224
- package/packages/omo-codex/plugin/skills/frontend/references/design/stylegallery.md +32 -27
- package/packages/omo-codex/plugin/skills/frontend/references/perfection/README.md +2 -2
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/check-accent-stripes.ts +8 -24
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/check-draft-guard.ts +40 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/collect-files.ts +53 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/findings.ts +16 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/lint.ts +38 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/rules.ts +69 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/draft-guard/text-nodes.ts +121 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/attr-lookalikes.tsx +10 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/bound-values.tsx +12 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/const-generics.tsx +3 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/generics.tsx +7 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/measured-stats.html +6 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/plain-copy.html +9 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/state-copy.html +11 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/attribute-edges.html +7 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/components.tsx +16 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/decorative-badge.vue +7 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/emoji-icons.tsx +9 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/jsx-edges.tsx +1 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.html +6 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.tsx +8 -0
- package/packages/omo-codex/plugin/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/vanity-stats.html +5 -0
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +10 -7
- package/packages/omo-codex/plugin/skills/programming/references/typescript/README.md +10 -7
- package/packages/omo-codex/plugin/skills/programming/references/typescript/bootstrap.md +9 -23
- package/packages/omo-codex/plugin/skills/programming/references/typescript/oxc-lint.md +130 -0
- package/packages/omo-codex/plugin/skills/programming/references/typescript/tsconfig-strict.md +6 -62
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/check-no-excuse-rules.ts +12 -12
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/new-project.ts +20 -81
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/.oxfmtrc.json +9 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/.oxlintrc.json +46 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/LICENSE +21 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/index.js +10 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/no-em-dash-copy.js +28 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/require-suppression-reason.js +62 -0
- package/packages/omo-codex/plugin/skills/programming/scripts/typescript/oxc/tsconfig.json +29 -0
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +14 -14
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/AGENTS.md +21 -3
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +37 -12
- package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +77 -16
- package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger-grammar.md +134 -0
- package/packages/omo-codex/plugin/skills/ulw-research/references/fact-ledger.md +95 -0
- package/packages/omo-codex/plugin/skills/ulw-research/references/fidelity-claim-kinds.md +19 -0
- package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +68 -3
- package/packages/omo-codex/plugin/skills/ulw-research/references/report-visualization.md +2 -0
- package/packages/omo-codex/plugin/skills/ulw-research/references/unit-rules.md +157 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/claim-kinds.mjs +116 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/claims-index.mjs +125 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/cli-support.mjs +19 -5
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/contracts.mjs +89 -3
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-meaning.mjs +191 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands-verify.mjs +164 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-commands.mjs +239 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-derive.mjs +66 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-expr.mjs +108 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-fill.mjs +194 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-kinds.mjs +250 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger-schema.mjs +221 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-ledger.mjs +123 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-locate.mjs +231 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-pairs.mjs +187 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fact-recompute.mjs +89 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-binding.mjs +130 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-brief.mjs +150 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-claims.mjs +89 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-lexicon.mjs +145 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-records.mjs +163 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-state.mjs +64 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-trace.mjs +85 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/fidelity-values.mjs +229 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-fidelity.mjs +113 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-static.mjs +29 -9
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-structure.mjs +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-text.mjs +1 -27
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-lite.mjs +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/html-markup.mjs +182 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/lexicon.mjs +47 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/md-lite.mjs +193 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/meaning-check.mjs +196 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/numerals.mjs +226 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/outcome.mjs +8 -8
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/particles-ko.mjs +108 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/placeholder.mjs +184 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-apply.mjs +115 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-diff.mjs +31 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-project.mjs +125 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/polish-rules.mjs +170 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/rational.mjs +139 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools-commands.mjs +21 -10
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/report-tools.mjs +15 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/sentence-split.mjs +77 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-commands.mjs +140 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/source-snapshot.mjs +176 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/text-normalize.mjs +82 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/text-similarity.mjs +28 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-algebra.mjs +101 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-errors.mjs +23 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-metadata.mjs +31 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-pairs.mjs +72 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-precision.mjs +44 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-rules-shapes.mjs +64 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/unit-rules.mjs +173 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/units.mjs +105 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +71 -64
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +4 -1
- package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +19 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +12 -8
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +169 -30
- package/packages/shared-skills/skills/ast-grep/AGENTS.md +1 -1
- package/packages/shared-skills/skills/browser/SKILL.md +21 -22
- package/packages/shared-skills/skills/browser/references/commands.md +2 -9
- package/packages/shared-skills/skills/browser/references/install.md +1 -2
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +2 -2
- package/packages/shared-skills/skills/browser/scripts/browser-engine-guard.mjs +63 -487
- package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +1 -1
- package/packages/shared-skills/skills/browser/scripts/omowright.mjs +1 -10
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +2 -2
- package/packages/shared-skills/skills/frontend/SKILL.md +79 -118
- package/packages/shared-skills/skills/frontend/references/design/README.md +75 -224
- package/packages/shared-skills/skills/frontend/references/design/stylegallery.md +32 -27
- package/packages/shared-skills/skills/frontend/references/perfection/README.md +2 -2
- package/packages/shared-skills/skills/frontend/scripts/perfection/check-accent-stripes.ts +8 -24
- package/packages/shared-skills/skills/frontend/scripts/perfection/check-draft-guard.test.ts +101 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/check-draft-guard.ts +40 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/collect-files.test.ts +50 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/collect-files.ts +53 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/findings.ts +16 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/lint.ts +38 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/rules.ts +69 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/draft-guard/text-nodes.ts +121 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/attr-lookalikes.tsx +10 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/bound-values.tsx +12 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/const-generics.tsx +3 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/generics.tsx +7 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/measured-stats.html +6 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/plain-copy.html +9 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/negative/state-copy.html +11 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/attribute-edges.html +7 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/components.tsx +16 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/decorative-badge.vue +7 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/emoji-icons.tsx +9 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/jsx-edges.tsx +1 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.html +6 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/promo-copy.tsx +8 -0
- package/packages/shared-skills/skills/frontend/scripts/perfection/fixtures/draft-guard/positive/vanity-stats.html +5 -0
- package/packages/shared-skills/skills/programming/SKILL.md +10 -7
- package/packages/shared-skills/skills/programming/references/typescript/README.md +10 -7
- package/packages/shared-skills/skills/programming/references/typescript/bootstrap.md +9 -23
- package/packages/shared-skills/skills/programming/references/typescript/oxc-lint.md +130 -0
- package/packages/shared-skills/skills/programming/references/typescript/tsconfig-strict.md +6 -62
- package/packages/shared-skills/skills/programming/scripts/typescript/check-no-excuse-rules.ts +12 -12
- package/packages/shared-skills/skills/programming/scripts/typescript/new-project.test.ts +162 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/new-project.ts +20 -81
- package/packages/shared-skills/skills/programming/scripts/typescript/oxc/.oxfmtrc.json +9 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/oxc/.oxlintrc.json +46 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/LICENSE +21 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/index.js +10 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/no-em-dash-copy.js +28 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/oxc/lint/oxlint-plugin/require-suppression-reason.js +62 -0
- package/packages/shared-skills/skills/programming/scripts/typescript/oxc/tsconfig.json +29 -0
- package/packages/shared-skills/skills/refactor/SKILL.md +13 -13
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/shared-skills/skills/ulw-execute/SKILL.md +1 -1
- package/packages/shared-skills/skills/ulw-research/AGENTS.md +21 -3
- package/packages/shared-skills/skills/ulw-research/SKILL.md +37 -12
- package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +77 -16
- package/packages/shared-skills/skills/ulw-research/references/fact-ledger-grammar.md +134 -0
- package/packages/shared-skills/skills/ulw-research/references/fact-ledger.md +95 -0
- package/packages/shared-skills/skills/ulw-research/references/fidelity-claim-kinds.md +19 -0
- package/packages/shared-skills/skills/ulw-research/references/report-gates.md +68 -3
- package/packages/shared-skills/skills/ulw-research/references/report-visualization.md +2 -0
- package/packages/shared-skills/skills/ulw-research/references/unit-rules.md +157 -0
- package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.mjs +116 -0
- package/packages/shared-skills/skills/ulw-research/scripts/claim-kinds.test.ts +193 -0
- package/packages/shared-skills/skills/ulw-research/scripts/claims-index.mjs +125 -0
- package/packages/shared-skills/skills/ulw-research/scripts/claims-index.test.ts +149 -0
- package/packages/shared-skills/skills/ulw-research/scripts/cli-support.mjs +19 -5
- package/packages/shared-skills/skills/ulw-research/scripts/cli-support.test.ts +13 -2
- package/packages/shared-skills/skills/ulw-research/scripts/contracts.mjs +89 -3
- package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +100 -12
- package/packages/shared-skills/skills/ulw-research/scripts/copy-returns.test.ts +183 -0
- package/packages/shared-skills/skills/ulw-research/scripts/delivery-barrier.test.ts +245 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-meaning.mjs +191 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-commands-verify.mjs +164 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-commands.mjs +239 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.mjs +66 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-derive.test.ts +375 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-expr.mjs +108 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-fill.mjs +194 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-fill.test.ts +221 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-grammar.test.ts +197 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.mjs +250 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-kinds.test.ts +156 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-legacy.test.ts +160 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-schema.mjs +221 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger-schema.test.ts +43 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger.mjs +123 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-ledger.test.ts +254 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-locate.mjs +231 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-locate.test.ts +118 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-pairs.mjs +187 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-pairs.test.ts +167 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-recompute.mjs +89 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-dimensions.test.ts +409 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fact-unit-rules.test.ts +388 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-binding.mjs +130 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-binding.test.ts +81 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-brief.mjs +150 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-brief.test.ts +179 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-claims.mjs +89 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-lexicon.mjs +145 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-lexicon.test.ts +117 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-records.mjs +163 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-state.mjs +64 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-state.test.ts +46 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-trace.mjs +85 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-trace.test.ts +58 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.mjs +229 -0
- package/packages/shared-skills/skills/ulw-research/scripts/fidelity-values.test.ts +270 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-context.test.ts +64 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-fidelity.mjs +113 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-fidelity.test.ts +73 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +29 -9
- package/packages/shared-skills/skills/ulw-research/scripts/gates-structure.mjs +1 -1
- package/packages/shared-skills/skills/ulw-research/scripts/gates-text.mjs +1 -27
- package/packages/shared-skills/skills/ulw-research/scripts/html-lite.mjs +2 -2
- package/packages/shared-skills/skills/ulw-research/scripts/html-markup.mjs +182 -0
- package/packages/shared-skills/skills/ulw-research/scripts/lexicon.mjs +47 -0
- package/packages/shared-skills/skills/ulw-research/scripts/lexicon.test.ts +57 -0
- package/packages/shared-skills/skills/ulw-research/scripts/md-lite.mjs +193 -0
- package/packages/shared-skills/skills/ulw-research/scripts/md-lite.test.ts +271 -0
- package/packages/shared-skills/skills/ulw-research/scripts/meaning-check.mjs +196 -0
- package/packages/shared-skills/skills/ulw-research/scripts/meaning-check.test.ts +228 -0
- package/packages/shared-skills/skills/ulw-research/scripts/numerals.mjs +226 -0
- package/packages/shared-skills/skills/ulw-research/scripts/numerals.test.ts +120 -0
- package/packages/shared-skills/skills/ulw-research/scripts/outcome.mjs +8 -8
- package/packages/shared-skills/skills/ulw-research/scripts/outcome.test.ts +29 -0
- package/packages/shared-skills/skills/ulw-research/scripts/particles-ko.mjs +108 -0
- package/packages/shared-skills/skills/ulw-research/scripts/particles-ko.test.ts +86 -0
- package/packages/shared-skills/skills/ulw-research/scripts/placeholder.mjs +184 -0
- package/packages/shared-skills/skills/ulw-research/scripts/placeholder.test.ts +77 -0
- package/packages/shared-skills/skills/ulw-research/scripts/polish-apply.mjs +115 -0
- package/packages/shared-skills/skills/ulw-research/scripts/polish-apply.test.ts +363 -0
- package/packages/shared-skills/skills/ulw-research/scripts/polish-diff.mjs +31 -0
- package/packages/shared-skills/skills/ulw-research/scripts/polish-diff.test.ts +168 -0
- package/packages/shared-skills/skills/ulw-research/scripts/polish-markup.test.ts +187 -0
- package/packages/shared-skills/skills/ulw-research/scripts/polish-project.mjs +125 -0
- package/packages/shared-skills/skills/ulw-research/scripts/polish-rules.mjs +170 -0
- package/packages/shared-skills/skills/ulw-research/scripts/rational.mjs +139 -0
- package/packages/shared-skills/skills/ulw-research/scripts/rational.test.ts +46 -0
- package/packages/shared-skills/skills/ulw-research/scripts/report-tools-commands.mjs +21 -10
- package/packages/shared-skills/skills/ulw-research/scripts/report-tools.mjs +15 -0
- package/packages/shared-skills/skills/ulw-research/scripts/report-tools.test.ts +458 -2
- package/packages/shared-skills/skills/ulw-research/scripts/sentence-split.mjs +77 -0
- package/packages/shared-skills/skills/ulw-research/scripts/sentence-split.test.ts +109 -0
- package/packages/shared-skills/skills/ulw-research/scripts/source-commands.mjs +140 -0
- package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.mjs +176 -0
- package/packages/shared-skills/skills/ulw-research/scripts/source-snapshot.test.ts +113 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/assets/share.csv +3 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/claim-graph.md +13 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/gen-legacy-dev.mjs +89 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/ledger-basic.json +223 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/ledger-legacy-dev.json +859 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/ledger-verify.json +420 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/report-bad.html +19 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/report-good.html +39 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/acronyms.json +3 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/meta.json +9 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/sentences.jsonl +7 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4/text.txt +7 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S4.html +19 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/acronyms.json +1 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/meta.json +9 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/sentences.jsonl +1 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S5/text.txt +1 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity/sources/S9.txt +1 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity-brief-locked.md +17 -0
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/fidelity-brief-pending.md +17 -0
- package/packages/shared-skills/skills/ulw-research/scripts/text-normalize.mjs +82 -0
- package/packages/shared-skills/skills/ulw-research/scripts/text-normalize.test.ts +73 -0
- package/packages/shared-skills/skills/ulw-research/scripts/text-similarity.mjs +28 -0
- package/packages/shared-skills/skills/ulw-research/scripts/text-similarity.test.ts +38 -0
- package/packages/shared-skills/skills/ulw-research/scripts/unit-algebra.mjs +101 -0
- package/packages/shared-skills/skills/ulw-research/scripts/unit-errors.mjs +23 -0
- package/packages/shared-skills/skills/ulw-research/scripts/unit-metadata.mjs +31 -0
- package/packages/shared-skills/skills/ulw-research/scripts/unit-pairs.mjs +72 -0
- package/packages/shared-skills/skills/ulw-research/scripts/unit-precision.mjs +44 -0
- package/packages/shared-skills/skills/ulw-research/scripts/unit-rules-shapes.mjs +64 -0
- package/packages/shared-skills/skills/ulw-research/scripts/unit-rules.mjs +173 -0
- package/packages/shared-skills/skills/ulw-research/scripts/units.mjs +105 -0
- package/packages/shared-skills/skills/ulw-research/scripts/units.test.ts +83 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +70 -63
- package/packages/shared-skills/skills/visual-qa/scripts/skill-doc-fields.test.ts +34 -0
- package/script/qa/web-terminal-visual-qa.mjs +6 -2
- package/script/qa/xterm-live-terminal.mjs +26 -3
|
@@ -6,6 +6,16 @@
|
|
|
6
6
|
|
|
7
7
|
export const SCHEMA_VERSION = 1
|
|
8
8
|
|
|
9
|
+
/** The severity vocabulary in rank order; every DEFECT_CODES entry uses one of these. */
|
|
10
|
+
export const SEVERITIES = Object.freeze(["blocker", "major", "minor"])
|
|
11
|
+
|
|
12
|
+
/** Defect counts per severity, then total. */
|
|
13
|
+
export function countDefects(defects) {
|
|
14
|
+
const counts = Object.fromEntries(SEVERITIES.map((severity) => [severity, 0]))
|
|
15
|
+
for (const defect of defects) counts[defect.severity] += 1
|
|
16
|
+
return { ...counts, total: defects.length }
|
|
17
|
+
}
|
|
18
|
+
|
|
9
19
|
function deepFreeze(value) {
|
|
10
20
|
if (value === null || typeof value !== "object") return value
|
|
11
21
|
for (const key of Object.keys(value)) deepFreeze(value[key])
|
|
@@ -39,12 +49,72 @@ export const DEFECT_CODES = deepFreeze({
|
|
|
39
49
|
layout_scroll_container: { severity: "minor", integrity: false, hint: "Scrolling content prints clipped; make the content fit or wrap the table in a scroll wrapper only for HTML deliverables." },
|
|
40
50
|
layout_image_distorted: { severity: "major", integrity: false, hint: "Preserve the image aspect ratio (object-fit: contain inside a fixed container)." },
|
|
41
51
|
layout_sibling_overlap: { severity: "major", integrity: false, hint: "Separate the overlapping elements (margins, grid, or a slide split)." },
|
|
52
|
+
unresolved_placeholder: { severity: "blocker", integrity: true, hint: "Register the fact with fact add or remove the sentence; a placeholder is never filled with a guess." },
|
|
53
|
+
value_mismatch: { severity: "blocker", integrity: true, hint: "Re-run fact fill; never edit a filled value by hand." },
|
|
54
|
+
unit_mismatch: { severity: "blocker", integrity: true, hint: "Re-run fact fill, or derive a converted row with fact derive --op convert." },
|
|
55
|
+
quote_not_verbatim: { severity: "blocker", integrity: true, hint: "Re-insert the quote through its {{Q<n>}} placeholder; after a second failure the sentence is replaced by the quote." },
|
|
56
|
+
claim_status_invalid: { severity: "blocker", integrity: true, hint: "The claim id is unknown, refuted, unresolved, or not in verified-claims; move the sentence to Gaps or Contradictions, or remove it." },
|
|
57
|
+
incompatible_operands: { severity: "blocker", integrity: true, hint: "The operands differ in unit, population, period, or basis for this operation; fix the rows or declare the operation that fits." },
|
|
58
|
+
pointer_label_mismatch: { severity: "blocker", integrity: true, hint: "The placeholder's label is not the row's label; check the id, then the label." },
|
|
59
|
+
quote_anchor_unresolved: { severity: "blocker", integrity: true, hint: "A from or to anchor is missing or occurs more than once in the quote; pick unique anchor words." },
|
|
60
|
+
unit_duplicated: { severity: "blocker", integrity: true, hint: "The unit after the placeholder repeats the row's unit; use :value or remove the unit." },
|
|
61
|
+
polish_diff_fail: { severity: "blocker", integrity: true, hint: "The polish pass changed numbers, tickers, table rows, claim ids, markup, or hidden content; revert to the pre-polish artifact and apply the language fixes only." },
|
|
62
|
+
fidelity_interview_incomplete: { severity: "blocker", integrity: true, hint: "A fidelity field is pending or missing in brief.md; answer the open question or record its default, then rerun." },
|
|
63
|
+
derived_not_allowed: { severity: "blocker", integrity: true, hint: "The brief allows no derived or assumed numbers; cite a source row directly or change the brief with the requester." },
|
|
64
|
+
source_outside_floor: { severity: "blocker", integrity: true, hint: "The row's source is outside the source floor the brief records; use a source the brief allows or remove the fact." },
|
|
65
|
+
snapshot_hash_mismatch: { severity: "blocker", integrity: true, hint: "The source snapshot changed after it was pinned; re-snapshot the source and re-register its rows." },
|
|
66
|
+
chart_value_untraceable: { severity: "blocker", integrity: true, hint: "A chart value, tick, or data file does not match its ledger-backed data source; re-render the chart from the exported data." },
|
|
67
|
+
quote_unbound: { severity: "blocker", integrity: true, hint: "A direct quotation has no ledger quote row; register it with fact quote and insert it through its placeholder." },
|
|
68
|
+
edition_unverified: { severity: "blocker", integrity: true, hint: "The delivered file has no matching fact verify record; run fact verify on that edition and record it with --verified-by." },
|
|
69
|
+
untraceable_number: { severity: "major", integrity: false, hint: "Replace the typed number with a {{F<n>}} placeholder backed by a ledger row, or register it as assumed with a rationale." },
|
|
70
|
+
unsupported_verification: { severity: "major", integrity: false, hint: "A sentence marked verified (data-claim-kind=\"verified\") cites a row that is not recorded command output; cite the recorded output row or drop the verified mark." },
|
|
71
|
+
claim_kind_mismatch: { severity: "major", integrity: false, hint: "An element marked with a claim kind (data-claim-kind) cites a row that kind does not accept, or the kind is unknown; cite a row of that kind or fix the mark (references/fidelity-claim-kinds.md)." },
|
|
72
|
+
conflicting_readings: { severity: "major", integrity: false, hint: "Two ledger rows with different periods or qualifiers are cited as one fact; split the sentence or retire one row." },
|
|
73
|
+
hedge_dropped: { severity: "major", integrity: false, hint: "Restore the qualifier the source uses (estimated, about, not yet)." },
|
|
74
|
+
direction_flipped: { severity: "major", integrity: false, hint: "The source states the opposite direction; rewrite from the quote." },
|
|
75
|
+
causality_added: { severity: "major", integrity: false, hint: "The source states no cause; state the correlation or quote the source." },
|
|
76
|
+
qualifier_dropped: { severity: "major", integrity: false, hint: "The source bounds this value (up to, at least, about); restore the qualifier or use :q." },
|
|
77
|
+
unbound_sentence: { severity: "major", integrity: false, hint: "Bind the sentence to a fact, a quote, a citation, or a claim-graph node with data-claim." },
|
|
78
|
+
meaning_drift_confirmed: { severity: "major", integrity: false, hint: "Two independent readers found the same drift; rewrite from the quote or dispute with a reason." },
|
|
79
|
+
meaning_unverified: { severity: "major", integrity: false, hint: "No meaning reader judged this pair, or no strong reader judged a force_strong pair; run the missing reader on pairs.json and rerun fact meaning-check." },
|
|
80
|
+
polish_edit_rejected: { severity: "major", integrity: false, hint: "The edit changed a number, a hedge, a qualifier, a link, or a claim id, or contained <, > or &; re-propose the language fix only, narrowed to the words around any entity or tag." },
|
|
81
|
+
polish_hedging_decreased: { severity: "major", integrity: false, hint: "The polish pass removed qualifiers; restore them." },
|
|
82
|
+
polish_text_churn: { severity: "major", integrity: false, hint: "More than half the text changed during polish; the pass composed instead of proofreading." },
|
|
83
|
+
snapshot_mismatch: { severity: "major", integrity: false, hint: "The operands come from different collection windows; use rows from one window or state the windows separately." },
|
|
84
|
+
join_integrity_fail: { severity: "major", integrity: false, hint: "A table row combines facts from different source observations; keep each row to one observation or split it." },
|
|
85
|
+
quote_stale_version: { severity: "major", integrity: false, hint: "The quoted source revision differs from the revision the report targets; re-snapshot the target revision or date the quote." },
|
|
86
|
+
quote_fuzzy_match: { severity: "minor", integrity: false, hint: "The source text is OCR-noisy; confirm the snapshot and prefer the raw document." },
|
|
87
|
+
name_outside_quote: { severity: "minor", integrity: false, hint: "A name in the sentence is not in the cited quote; add the source or remove the name." },
|
|
88
|
+
verification_claim_unmarked: { severity: "minor", integrity: false, hint: "The sentence reads as a check we ran but carries no verified mark; mark it {{V:F<n>:label}} on a recorded command-output row, or reword it." },
|
|
89
|
+
scope_widened_warn: { severity: "minor", integrity: false, hint: "The sentence uses a broader scope word than the quote; confirm the scope or narrow it." },
|
|
90
|
+
particle_unverified: { severity: "minor", integrity: false, hint: "The particle after this value could not be checked; read it aloud and fix it by hand if wrong." },
|
|
91
|
+
fallback_without_entity: { severity: "minor", integrity: false, hint: "The replacement quote has no entity for attribution; set one on the row." },
|
|
92
|
+
meaning_drift_warn: { severity: "minor", integrity: false, hint: "A separate reader found the sentence changes scope, subject, or certainty; rewrite from the quote." },
|
|
93
|
+
polish_edit_unlocated: { severity: "minor", integrity: false, hint: "The edit's before-text was not found exactly once; re-propose against the current text." },
|
|
94
|
+
polish_link_changed: { severity: "minor", integrity: false, hint: "A link was altered or removed during polish; restore it." },
|
|
95
|
+
polish_name_changed: { severity: "minor", integrity: false, hint: "A proper noun changed during polish; restore it." },
|
|
42
96
|
})
|
|
43
97
|
|
|
98
|
+
/** Codes only the fidelity verifier raises (fact ledger, fill, verify, meaning, polish). */
|
|
99
|
+
export const FIDELITY_CODES = Object.freeze([
|
|
100
|
+
"unresolved_placeholder", "value_mismatch", "unit_mismatch", "quote_not_verbatim", "claim_status_invalid",
|
|
101
|
+
"incompatible_operands", "pointer_label_mismatch", "quote_anchor_unresolved", "unit_duplicated", "polish_diff_fail",
|
|
102
|
+
"fidelity_interview_incomplete", "derived_not_allowed", "source_outside_floor", "snapshot_hash_mismatch",
|
|
103
|
+
"chart_value_untraceable", "quote_unbound", "edition_unverified", "untraceable_number", "unsupported_verification", "claim_kind_mismatch",
|
|
104
|
+
"conflicting_readings", "hedge_dropped", "direction_flipped", "causality_added", "qualifier_dropped", "unbound_sentence",
|
|
105
|
+
"meaning_drift_confirmed", "meaning_unverified", "polish_edit_rejected", "polish_hedging_decreased", "polish_text_churn", "snapshot_mismatch",
|
|
106
|
+
"join_integrity_fail", "quote_stale_version", "quote_fuzzy_match", "name_outside_quote", "verification_claim_unmarked", "scope_widened_warn",
|
|
107
|
+
"particle_unverified", "fallback_without_entity", "meaning_drift_warn", "polish_edit_unlocated", "polish_link_changed",
|
|
108
|
+
"polish_name_changed",
|
|
109
|
+
])
|
|
110
|
+
const FIDELITY_SET = new Set(FIDELITY_CODES)
|
|
111
|
+
|
|
44
112
|
const LAYOUT_PREFIX = "layout_"
|
|
45
113
|
/** Codes checkStatic can raise (G1-G17). */
|
|
46
114
|
export const STATIC_CODES = Object.freeze(
|
|
47
|
-
Object.keys(DEFECT_CODES).filter(
|
|
115
|
+
Object.keys(DEFECT_CODES).filter(
|
|
116
|
+
(code) => !code.startsWith(LAYOUT_PREFIX) && code !== "missing_promised_deliverable" && !FIDELITY_SET.has(code),
|
|
117
|
+
),
|
|
48
118
|
)
|
|
49
119
|
/** Codes checkLayout can raise (L1-L5). */
|
|
50
120
|
export const LAYOUT_CODES = Object.freeze(Object.keys(DEFECT_CODES).filter((code) => code.startsWith(LAYOUT_PREFIX)))
|
|
@@ -59,10 +129,10 @@ export const LANES = Object.freeze(["template-strict", "template-vibe", "no-form
|
|
|
59
129
|
export const STATES = Object.freeze(["none", "partial", "complete"])
|
|
60
130
|
export const DELIVERABLE_FORMATS = Object.freeze(["pdf", "docx", "html", "md", "latex", "slides", "post"])
|
|
61
131
|
export const DELIVERABLE_STATUSES = Object.freeze(["pending", "delivered", "blocked_capability", "skipped", "failed"])
|
|
62
|
-
export const GATE_NAMES = Object.freeze(["static", "layout", "visual", "proofread"])
|
|
132
|
+
export const GATE_NAMES = Object.freeze(["static", "fidelity", "layout", "visual", "proofread"])
|
|
63
133
|
export const GATE_STATUSES = Object.freeze(["pass", "fail", "not_run"])
|
|
64
134
|
export const LINEAGE_MODES = Object.freeze(["inline", "section"])
|
|
65
|
-
export const ANSWERED_BY = Object.freeze(["user", "default", "request"])
|
|
135
|
+
export const ANSWERED_BY = Object.freeze(["user", "default", "request", "pending"])
|
|
66
136
|
export const REPAIR_DEFAULTS = Object.freeze({ maxAttempts: 3, plateauLimit: 2, wallClockMs: 15 * 60 * 1000 })
|
|
67
137
|
export const DESIGN_SPEC_SECTIONS = Object.freeze([
|
|
68
138
|
"Extracted from",
|
|
@@ -127,6 +197,14 @@ export function validateOutcomeManifest(manifest) {
|
|
|
127
197
|
if (isObject(manifest.gates)) {
|
|
128
198
|
for (const gate of GATE_NAMES) check(errors, GATE_STATUSES.includes(manifest.gates[gate]), `gates.${gate} must be one of ${GATE_STATUSES.join(", ")}`)
|
|
129
199
|
} else errors.push("gates must be an object")
|
|
200
|
+
if (manifest.gateHistory !== undefined) {
|
|
201
|
+
if (!Array.isArray(manifest.gateHistory)) errors.push("gateHistory must be an array")
|
|
202
|
+
else for (const entry of manifest.gateHistory) {
|
|
203
|
+
check(errors, isObject(entry) && GATE_NAMES.includes(entry.gate) && GATE_STATUSES.includes(entry.status)
|
|
204
|
+
&& typeof entry.at === "string" && ISO_DATE.test(entry.at)
|
|
205
|
+
&& (entry.reason === undefined || typeof entry.reason === "string"), "gateHistory entries must have a known gate, status, timestamp, and optional reason")
|
|
206
|
+
}
|
|
207
|
+
}
|
|
130
208
|
if (Array.isArray(manifest.residualDefects)) manifest.residualDefects.forEach((defect, index) => validateDefect(defect, `residualDefects[${index}]`, errors))
|
|
131
209
|
else errors.push("residualDefects must be an array")
|
|
132
210
|
check(errors, manifest.repair === null || isObject(manifest.repair), "repair must be null or an object")
|
|
@@ -134,6 +212,14 @@ export function validateOutcomeManifest(manifest) {
|
|
|
134
212
|
return { ok: errors.length === 0, errors }
|
|
135
213
|
}
|
|
136
214
|
|
|
215
|
+
/** A copy of a manifest written before a gate existed: every absent gate key becomes not_run. */
|
|
216
|
+
export function normalizeManifest(manifest) {
|
|
217
|
+
if (!isObject(manifest) || !isObject(manifest.gates)) return manifest
|
|
218
|
+
const gates = { ...manifest.gates }
|
|
219
|
+
for (const gate of GATE_NAMES) if (!Object.hasOwn(gates, gate)) gates[gate] = "not_run"
|
|
220
|
+
return { ...manifest, gates }
|
|
221
|
+
}
|
|
222
|
+
|
|
137
223
|
function isMeasure(value) {
|
|
138
224
|
return Array.isArray(value) && value.length === 3 && value.every((n) => Number.isInteger(n) && n >= 0)
|
|
139
225
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test"
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
ANSWERED_BY,
|
|
4
5
|
DEFECT_CODES,
|
|
5
6
|
DELIVERABLE_FORMATS,
|
|
6
7
|
DELIVERABLE_STATUSES,
|
|
7
8
|
DESIGN_SPEC_SECTIONS,
|
|
9
|
+
FIDELITY_CODES,
|
|
8
10
|
GATE_NAMES,
|
|
9
11
|
GATE_STATUSES,
|
|
10
12
|
INTEGRITY_CODES,
|
|
@@ -16,6 +18,7 @@ import {
|
|
|
16
18
|
SCHEMA_VERSION,
|
|
17
19
|
STATES,
|
|
18
20
|
STATIC_CODES,
|
|
21
|
+
normalizeManifest,
|
|
19
22
|
validateOutcomeManifest,
|
|
20
23
|
validateRepairState,
|
|
21
24
|
} from "./contracts.mjs"
|
|
@@ -49,6 +52,64 @@ const LAYOUT_CODES_EXPECTED = [
|
|
|
49
52
|
"layout_image_distorted",
|
|
50
53
|
"layout_sibling_overlap",
|
|
51
54
|
]
|
|
55
|
+
// Fidelity vocabulary contract (#11009): severity and integrity per code are fixed here.
|
|
56
|
+
const FIDELITY_BLOCKERS = [
|
|
57
|
+
"unresolved_placeholder",
|
|
58
|
+
"value_mismatch",
|
|
59
|
+
"unit_mismatch",
|
|
60
|
+
"quote_not_verbatim",
|
|
61
|
+
"claim_status_invalid",
|
|
62
|
+
"incompatible_operands",
|
|
63
|
+
"pointer_label_mismatch",
|
|
64
|
+
"quote_anchor_unresolved",
|
|
65
|
+
"unit_duplicated",
|
|
66
|
+
"polish_diff_fail",
|
|
67
|
+
"fidelity_interview_incomplete",
|
|
68
|
+
"derived_not_allowed",
|
|
69
|
+
"source_outside_floor",
|
|
70
|
+
"snapshot_hash_mismatch",
|
|
71
|
+
"chart_value_untraceable",
|
|
72
|
+
"quote_unbound",
|
|
73
|
+
"edition_unverified",
|
|
74
|
+
]
|
|
75
|
+
const FIDELITY_MAJORS = [
|
|
76
|
+
"untraceable_number",
|
|
77
|
+
"unsupported_verification",
|
|
78
|
+
"claim_kind_mismatch",
|
|
79
|
+
"conflicting_readings",
|
|
80
|
+
"hedge_dropped",
|
|
81
|
+
"direction_flipped",
|
|
82
|
+
"causality_added",
|
|
83
|
+
"qualifier_dropped",
|
|
84
|
+
"unbound_sentence",
|
|
85
|
+
"meaning_drift_confirmed",
|
|
86
|
+
"meaning_unverified",
|
|
87
|
+
"polish_edit_rejected",
|
|
88
|
+
"polish_hedging_decreased",
|
|
89
|
+
"polish_text_churn",
|
|
90
|
+
"snapshot_mismatch",
|
|
91
|
+
"join_integrity_fail",
|
|
92
|
+
"quote_stale_version",
|
|
93
|
+
]
|
|
94
|
+
const FIDELITY_MINORS = [
|
|
95
|
+
"quote_fuzzy_match",
|
|
96
|
+
"name_outside_quote",
|
|
97
|
+
"verification_claim_unmarked",
|
|
98
|
+
"scope_widened_warn",
|
|
99
|
+
"particle_unverified",
|
|
100
|
+
"fallback_without_entity",
|
|
101
|
+
"meaning_drift_warn",
|
|
102
|
+
"polish_edit_unlocated",
|
|
103
|
+
"polish_link_changed",
|
|
104
|
+
"polish_name_changed",
|
|
105
|
+
]
|
|
106
|
+
const FIDELITY_CODES_EXPECTED = [...FIDELITY_BLOCKERS, ...FIDELITY_MAJORS, ...FIDELITY_MINORS]
|
|
107
|
+
|
|
108
|
+
function fourGateManifest() {
|
|
109
|
+
const manifest = sampleManifest()
|
|
110
|
+
const { fidelity: _dropped, ...gates } = manifest.gates
|
|
111
|
+
return { ...manifest, gates }
|
|
112
|
+
}
|
|
52
113
|
|
|
53
114
|
function sampleManifest() {
|
|
54
115
|
return {
|
|
@@ -63,7 +124,7 @@ function sampleManifest() {
|
|
|
63
124
|
{ format: "pdf", status: "pending", promised: true, updatedAt: "2026-01-01T12:00:00.000Z" },
|
|
64
125
|
],
|
|
65
126
|
renders: [],
|
|
66
|
-
gates: { static: "not_run", layout: "not_run", visual: "not_run", proofread: "not_run" },
|
|
127
|
+
gates: { static: "not_run", fidelity: "not_run", layout: "not_run", visual: "not_run", proofread: "not_run" },
|
|
67
128
|
residualDefects: [],
|
|
68
129
|
repair: null,
|
|
69
130
|
sources: null,
|
|
@@ -72,7 +133,9 @@ function sampleManifest() {
|
|
|
72
133
|
|
|
73
134
|
describe("DEFECT_CODES", () => {
|
|
74
135
|
test("#given the code table #when every code is inspected #then it has a severity, a hint, and an integrity flag", () => {
|
|
75
|
-
expect(Object.keys(DEFECT_CODES).sort()).toEqual(
|
|
136
|
+
expect(Object.keys(DEFECT_CODES).sort()).toEqual(
|
|
137
|
+
[...STATIC_CODES_EXPECTED, "missing_promised_deliverable", ...LAYOUT_CODES_EXPECTED, ...FIDELITY_CODES_EXPECTED].sort(),
|
|
138
|
+
)
|
|
76
139
|
for (const [code, entry] of Object.entries(DEFECT_CODES)) {
|
|
77
140
|
expect(SEVERITIES.has(entry.severity), `${code} severity`).toBe(true)
|
|
78
141
|
expect(typeof entry.hint).toBe("string")
|
|
@@ -81,14 +144,17 @@ describe("DEFECT_CODES", () => {
|
|
|
81
144
|
}
|
|
82
145
|
})
|
|
83
146
|
|
|
84
|
-
test("#given the code table #when integrity codes are derived #then they are exactly the
|
|
85
|
-
expect([...INTEGRITY_CODES].sort()).toEqual(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
147
|
+
test("#given the code table #when integrity codes are derived #then they are exactly the blocker codes", () => {
|
|
148
|
+
expect([...INTEGRITY_CODES].sort()).toEqual(
|
|
149
|
+
[
|
|
150
|
+
"broken_asset_reference",
|
|
151
|
+
"missing_citation_section",
|
|
152
|
+
"missing_closing_section",
|
|
153
|
+
"missing_promised_deliverable",
|
|
154
|
+
"missing_required_section",
|
|
155
|
+
...FIDELITY_BLOCKERS,
|
|
156
|
+
].sort(),
|
|
157
|
+
)
|
|
92
158
|
for (const code of INTEGRITY_CODES) expect(DEFECT_CODES[code].severity).toBe("blocker")
|
|
93
159
|
for (const [code, entry] of Object.entries(DEFECT_CODES)) {
|
|
94
160
|
if (entry.severity === "blocker") expect(INTEGRITY_CODES.has(code), `${code} must be integrity`).toBe(true)
|
|
@@ -104,6 +170,13 @@ describe("DEFECT_CODES", () => {
|
|
|
104
170
|
}).toThrow()
|
|
105
171
|
expect(DEFECT_CODES.korean_no_keep_all.severity).toBe("major")
|
|
106
172
|
})
|
|
173
|
+
|
|
174
|
+
test("#given the fidelity codes #when inspected #then each carries its fixed severity and integrity flag", () => {
|
|
175
|
+
for (const code of FIDELITY_BLOCKERS) expect([code, DEFECT_CODES[code]?.severity, DEFECT_CODES[code]?.integrity]).toEqual([code, "blocker", true])
|
|
176
|
+
for (const code of FIDELITY_MAJORS) expect([code, DEFECT_CODES[code]?.severity, DEFECT_CODES[code]?.integrity]).toEqual([code, "major", false])
|
|
177
|
+
for (const code of FIDELITY_MINORS) expect([code, DEFECT_CODES[code]?.severity, DEFECT_CODES[code]?.integrity]).toEqual([code, "minor", false])
|
|
178
|
+
expect(DEFECT_CODES).not.toHaveProperty("incompatible_populations")
|
|
179
|
+
})
|
|
107
180
|
})
|
|
108
181
|
|
|
109
182
|
describe("code groups", () => {
|
|
@@ -111,10 +184,12 @@ describe("code groups", () => {
|
|
|
111
184
|
expect([...STATIC_CODES].sort()).toEqual(STATIC_CODES_EXPECTED.slice().sort())
|
|
112
185
|
expect([...LAYOUT_CODES].sort()).toEqual(LAYOUT_CODES_EXPECTED.slice().sort())
|
|
113
186
|
expect([...MANIFEST_CODES]).toEqual(["missing_promised_deliverable"])
|
|
114
|
-
|
|
187
|
+
expect([...FIDELITY_CODES].sort()).toEqual(FIDELITY_CODES_EXPECTED.slice().sort())
|
|
188
|
+
const union = [...STATIC_CODES, ...LAYOUT_CODES, ...MANIFEST_CODES, ...FIDELITY_CODES].sort()
|
|
115
189
|
expect(union).toEqual(Object.keys(DEFECT_CODES).sort())
|
|
116
190
|
expect(new Set(union).size).toBe(union.length)
|
|
117
191
|
expect(Object.isFrozen(STATIC_CODES)).toBe(true)
|
|
192
|
+
expect(Object.isFrozen(FIDELITY_CODES)).toBe(true)
|
|
118
193
|
})
|
|
119
194
|
})
|
|
120
195
|
|
|
@@ -124,7 +199,8 @@ describe("enums", () => {
|
|
|
124
199
|
expect(STATES).toEqual(["none", "partial", "complete"])
|
|
125
200
|
expect(DELIVERABLE_FORMATS).toEqual(["pdf", "docx", "html", "md", "latex", "slides", "post"])
|
|
126
201
|
expect(DELIVERABLE_STATUSES).toEqual(["pending", "delivered", "blocked_capability", "skipped", "failed"])
|
|
127
|
-
expect(GATE_NAMES).toEqual(["static", "layout", "visual", "proofread"])
|
|
202
|
+
expect(GATE_NAMES).toEqual(["static", "fidelity", "layout", "visual", "proofread"])
|
|
203
|
+
expect(ANSWERED_BY).toEqual(["user", "default", "request", "pending"])
|
|
128
204
|
expect(GATE_STATUSES).toEqual(["pass", "fail", "not_run"])
|
|
129
205
|
expect(LINEAGE_MODES).toEqual(["inline", "section"])
|
|
130
206
|
expect(DESIGN_SPEC_SECTIONS).toEqual([
|
|
@@ -155,6 +231,18 @@ describe("validateOutcomeManifest", () => {
|
|
|
155
231
|
expect(result.errors.join("\n")).toMatch(/deliverables\[0\]\.status/)
|
|
156
232
|
})
|
|
157
233
|
|
|
234
|
+
test("#given a manifest written before the fidelity gate #when validated raw and after normalizeManifest #then only the normalized copy passes, with fidelity not_run", () => {
|
|
235
|
+
const old = fourGateManifest()
|
|
236
|
+
expect(validateOutcomeManifest(old).ok).toBe(false)
|
|
237
|
+
const normalized = normalizeManifest(old)
|
|
238
|
+
expect(normalized.gates.fidelity).toBe("not_run")
|
|
239
|
+
expect(normalized.gates.static).toBe("not_run")
|
|
240
|
+
expect(validateOutcomeManifest(normalized)).toEqual({ ok: true, errors: [] })
|
|
241
|
+
expect(old.gates).not.toHaveProperty("fidelity")
|
|
242
|
+
const failed = { ...old, gates: { ...old.gates, visual: "fail" } }
|
|
243
|
+
expect(normalizeManifest(failed).gates.visual).toBe("fail")
|
|
244
|
+
})
|
|
245
|
+
|
|
158
246
|
test("#given a gate with an unknown value #when validated #then it fails", () => {
|
|
159
247
|
const m = sampleManifest()
|
|
160
248
|
m.gates.static = "ok"
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Architecture contract (retention bar): each shared table, list, regex, or classifier has one owner
|
|
2
|
+
// export, so a reintroduced local copy in a consumer fails one of these tests (#11156 sweep).
|
|
3
|
+
import { describe, expect, test } from "bun:test"
|
|
4
|
+
import { readdirSync, readFileSync } from "node:fs"
|
|
5
|
+
import { join } from "node:path"
|
|
6
|
+
|
|
7
|
+
import { sha256Of } from "./cli-support.mjs"
|
|
8
|
+
import { countDefects, DEFECT_CODES, SEVERITIES } from "./contracts.mjs"
|
|
9
|
+
import { meaningStatus, PROMOTION, promotionEligibility } from "./fact-commands-meaning.mjs"
|
|
10
|
+
import { editionFormatOf, MD_HTML_BLOCK_RULES, markdownAsHtml, projectMarkdownInline } from "./fact-commands-verify.mjs"
|
|
11
|
+
import { EXEMPT_KINDS, isExemptKind } from "./fidelity-binding.mjs"
|
|
12
|
+
import { blocksDelivery } from "./gates-fidelity.mjs"
|
|
13
|
+
import { MD_BLOCK_PATTERNS, parseMarkdown } from "./md-lite.mjs"
|
|
14
|
+
import { DRIFT_KINDS, isDriftKind, MODEL_TIERS, VERDICT_SCHEMA, VERDICTS } from "./meaning-check.mjs"
|
|
15
|
+
import { parseRenderedQuote, renderQuote } from "./placeholder.mjs"
|
|
16
|
+
|
|
17
|
+
const source = (name: string) => readFileSync(join(import.meta.dir, name), "utf8")
|
|
18
|
+
|
|
19
|
+
describe("severity vocabulary comes from contracts", () => {
|
|
20
|
+
test("#given DEFECT_CODES #when its severities are collected #then they are exactly SEVERITIES", () => {
|
|
21
|
+
const used = new Set(Object.values(DEFECT_CODES).map((entry) => entry.severity))
|
|
22
|
+
expect([...used].sort()).toEqual([...SEVERITIES].sort())
|
|
23
|
+
expect(Object.isFrozen(SEVERITIES)).toBe(true)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
test("#given defects of every severity #when counted #then the buckets are SEVERITIES plus total", () => {
|
|
27
|
+
const defects = SEVERITIES.map((severity) => ({ severity }))
|
|
28
|
+
expect(Object.keys(countDefects(defects))).toEqual([...SEVERITIES, "total"])
|
|
29
|
+
expect(countDefects(defects)).toEqual({ ...Object.fromEntries(SEVERITIES.map((severity) => [severity, 1])), total: SEVERITIES.length })
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test("#given every registry code and an unknown code #when the meaning status is computed #then it follows blocksDelivery", () => {
|
|
33
|
+
for (const code of [...Object.keys(DEFECT_CODES), "not_a_registered_code"]) {
|
|
34
|
+
expect(meaningStatus([{ code, severity: "minor" }]), code).toBe(blocksDelivery({ code }) ? "fail" : "pass")
|
|
35
|
+
}
|
|
36
|
+
expect(meaningStatus([])).toBe("pass")
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test("#given the command modules #when read #then none restates the severity buckets, the pair kinds, or a window literal", () => {
|
|
40
|
+
for (const name of ["fact-commands-meaning.mjs", "fact-commands-verify.mjs"]) {
|
|
41
|
+
const text = source(name)
|
|
42
|
+
expect(text, name).not.toMatch(/blocker:\s*0/u)
|
|
43
|
+
expect(text, name).not.toMatch(/\["quote",\s*"claim",\s*"translation"\]/u)
|
|
44
|
+
expect(text, name).not.toMatch(/slice\(-\d+\)/u)
|
|
45
|
+
expect(text, name).not.toMatch(/counts\.blocker \+ counts\.major/u)
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
describe("one sha256 helper", () => {
|
|
51
|
+
test("#given every runtime module #when read #then only cli-support builds a hash, so records and receipts share sha256Of", () => {
|
|
52
|
+
const modules = readdirSync(import.meta.dir).filter((name) => name.endsWith(".mjs") && name !== "cli-support.mjs")
|
|
53
|
+
expect(modules.length).toBeGreaterThan(0)
|
|
54
|
+
for (const name of modules) expect(source(name), name).not.toMatch(/createHash\(/u)
|
|
55
|
+
expect(sha256Of("abc")).toBe("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
|
|
56
|
+
expect(sha256Of(Buffer.from("abc"))).toBe(sha256Of("abc"))
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe("calibration policy is the exported PROMOTION", () => {
|
|
61
|
+
const confirmedRun = (run: string, disputed: boolean) => ({ run_id: run, confirmed: true, disputed })
|
|
62
|
+
|
|
63
|
+
test("#given false blocks only before the window #when eligibility is computed #then they are not counted", () => {
|
|
64
|
+
const window = PROMOTION.false_block_window
|
|
65
|
+
expect(Number.isInteger(window) && window > 0).toBe(true)
|
|
66
|
+
const old = [0, 1, 2].map((n) => confirmedRun(`old${n}`, true))
|
|
67
|
+
const recent = Array.from({ length: window }, (_, n) => confirmedRun(`new${n}`, false))
|
|
68
|
+
expect(promotionEligibility([...old, ...recent]).report_false_blocks_in_window).toBe(0)
|
|
69
|
+
expect(promotionEligibility([...recent, ...old]).report_false_blocks_in_window).toBe(3)
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
test("#given false blocks at the policy maximum #when eligibility is computed #then the threshold read from PROMOTION decides", () => {
|
|
73
|
+
const limit = PROMOTION.max_report_false_blocks_in_window
|
|
74
|
+
const clean = Array.from({ length: PROMOTION.min_runs * 20 }, (_, n) => confirmedRun(`c${n}`, false))
|
|
75
|
+
const blocks = (count: number) => Array.from({ length: count }, (_, n) => confirmedRun(`b${n}`, true))
|
|
76
|
+
expect(promotionEligibility([...clean, ...blocks(limit)]).eligible).toBe(true)
|
|
77
|
+
expect(promotionEligibility([...clean, ...blocks(limit + 1)]).eligible).toBe(false)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
describe("verdict schema comes from the meaning-check registries", () => {
|
|
82
|
+
test("#given VERDICT_SCHEMA #when read #then its vocabularies are the owner exports", () => {
|
|
83
|
+
expect(VERDICT_SCHEMA.verdict).toBe(VERDICTS)
|
|
84
|
+
expect(VERDICT_SCHEMA.model_tier).toBe(MODEL_TIERS)
|
|
85
|
+
expect(VERDICT_SCHEMA.drift_kind).toBe(DRIFT_KINDS)
|
|
86
|
+
expect(Object.isFrozen(VERDICTS)).toBe(true)
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
test("#given every drift kind and a stranger #when checked #then isDriftKind is membership in DRIFT_KINDS", () => {
|
|
90
|
+
for (const kind of DRIFT_KINDS) expect(isDriftKind(kind)).toBe(true)
|
|
91
|
+
expect(isDriftKind("not_a_kind")).toBe(false)
|
|
92
|
+
expect(source("meaning-check.mjs")).not.toMatch(/new Set\(DRIFT_KINDS\)|new Set\(\["drift"/u)
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
describe("inherited lexical tables come from their owners", () => {
|
|
97
|
+
test("#given fact-pairs #when read #then it holds no Hangul range, exempt-kind set, or hand-built hedge regex", () => {
|
|
98
|
+
const text = source("fact-pairs.mjs")
|
|
99
|
+
expect(text).not.toMatch(/\\uAC00-\\uD7A3/u)
|
|
100
|
+
expect(text).not.toMatch(/\["opinion",\s*"recommendation"\]/u)
|
|
101
|
+
expect(text).not.toMatch(/new RegExp\(/u)
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
test("#given EXEMPT_KINDS #when checked #then isExemptKind is membership in it", () => {
|
|
105
|
+
for (const kind of EXEMPT_KINDS) expect(isExemptKind(kind)).toBe(true)
|
|
106
|
+
expect(isExemptKind("finding")).toBe(false)
|
|
107
|
+
expect(isExemptKind(undefined)).toBe(false)
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
test("#given md-lite #when its block grammar is read #then MD_BLOCK_PATTERNS names every block regex", () => {
|
|
111
|
+
expect(Object.keys(MD_BLOCK_PATTERNS).sort()).toEqual(["BLOCKQUOTE", "CLOSING_HASHES", "FENCE", "HEADING", "LIST_ITEM", "TABLE_SEPARATOR", "THEMATIC_BREAK"])
|
|
112
|
+
for (const pattern of Object.values(MD_BLOCK_PATTERNS)) expect(pattern).toBeInstanceOf(RegExp)
|
|
113
|
+
expect(Object.isFrozen(MD_BLOCK_PATTERNS)).toBe(true)
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
describe("markdown projection rules", () => {
|
|
118
|
+
const EVERY_KIND = ["# Title", "", "Para text.", "", "- item", "", "> quoted", "", "| a | b |", "| - | - |", "| 1 | 2 |", "", "```", "code", "```", ""].join("\n")
|
|
119
|
+
|
|
120
|
+
test("#given every block kind md-lite emits #when projected #then each kind has a projection rule", () => {
|
|
121
|
+
const kinds = [...new Set(parseMarkdown(EVERY_KIND).blocks.map((block: { kind: string }) => block.kind))].sort()
|
|
122
|
+
expect(kinds).toEqual(["blockquote", "code", "heading", "list_item", "paragraph", "table_row"])
|
|
123
|
+
for (const kind of kinds) expect(Object.hasOwn(MD_HTML_BLOCK_RULES, kind), kind).toBe(true)
|
|
124
|
+
expect(Object.keys(MD_HTML_BLOCK_RULES).sort()).toEqual(kinds)
|
|
125
|
+
const { html } = markdownAsHtml(EVERY_KIND, [], { rows: [] })
|
|
126
|
+
expect(html).toContain("<h1>Title</h1>")
|
|
127
|
+
expect(html).toContain("<ul><li>item</li></ul>")
|
|
128
|
+
expect(html).toMatch(/<table><tr><td>a<\/td><td>b<\/td><\/tr>\s*<tr><td>1<\/td><td>2<\/td><\/tr><\/table>/u)
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
test("#given an unterminated fence #when projected #then it is refused naming the line", () => {
|
|
132
|
+
expect(() => markdownAsHtml("Intro.\n\n```\nno close\n", [], { rows: [] })).toThrow(/unterminated_fence at line 3/u)
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
test("#given inline links and code #when projected #then they stay elements and the rest is escaped", () => {
|
|
136
|
+
expect(projectMarkdownInline("a <b> [x](https://e.x) `c`")).toBe('a <b> <a href="https://e.x">x</a> <code>c</code>')
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
test("#given a fill map with quotes in translates and fact_id #when projected #then the attributes are escaped", () => {
|
|
140
|
+
const md = "Before X after.\n\n> Quoted block.\n"
|
|
141
|
+
const span = { fact_id: 'F"1', start: 7, end: 8, rendered: "X", translates: 'T"1' }
|
|
142
|
+
const block = { fact_id: 'Q"2', start: md.indexOf(">"), end: md.length - 1, rendered: "", replaced: "a" }
|
|
143
|
+
const { html } = markdownAsHtml(md, [span, block], { rows: [] })
|
|
144
|
+
expect(html).toContain('data-translates="T"1"')
|
|
145
|
+
expect(html).toContain('data-fact="Q"2"')
|
|
146
|
+
expect(markdownAsHtml("Before X after.\n", [{ ...span, translates: undefined }], { rows: [] }).html).toContain('data-fact="F"1"')
|
|
147
|
+
expect(html).not.toMatch(/="[^"]*"1"/u)
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
test("#given paths of each case #when the format is inferred #then md and markdown are Markdown and a flag wins", () => {
|
|
151
|
+
expect(["r.md", "R.MD", "r.markdown", "r.html", "r.txt"].map((path) => editionFormatOf(path, undefined))).toEqual(["md", "md", "md", "html", "html"])
|
|
152
|
+
expect(editionFormatOf("r.md", "html")).toBe("html")
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
describe("rendered quotes round-trip through the placeholder owner", () => {
|
|
157
|
+
const row = { fact_id: "Q1", kind: "quote", source_id: "S4", quote: "We estimate completion no earlier than 2027." }
|
|
158
|
+
const selections = [
|
|
159
|
+
["full", row.quote],
|
|
160
|
+
["lead=2", "We estimate"],
|
|
161
|
+
["from=completion,to=2027", "completion no earlier than 2027"],
|
|
162
|
+
]
|
|
163
|
+
|
|
164
|
+
for (const [selector, text] of selections) {
|
|
165
|
+
test(`#given a ${selector} quote rendered for md #when projected #then the quote element and marker survive`, () => {
|
|
166
|
+
const rendered = renderQuote(row, selector, text, "md")
|
|
167
|
+
expect(parseRenderedQuote(rendered)).toEqual({ text, marker: "[S4]" })
|
|
168
|
+
const md = `The operator wrote ${rendered}.\n`
|
|
169
|
+
const entry = { fact_id: "Q1", start: md.indexOf(rendered), end: md.indexOf(rendered) + rendered.length, rendered, selector }
|
|
170
|
+
const projected = markdownAsHtml(md, [entry], { rows: [row] })
|
|
171
|
+
expect(projected.html).toContain(renderQuote(row, selector, text, "html"))
|
|
172
|
+
expect(projected.stale).toEqual([])
|
|
173
|
+
const edited = md.replace(text, `${text} indeed`)
|
|
174
|
+
const stale = markdownAsHtml(edited, [{ ...entry, end: entry.end + " indeed".length }], { rows: [row] })
|
|
175
|
+
expect(stale.html).not.toContain("<q ")
|
|
176
|
+
expect(stale.stale).toHaveLength(1)
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
test("#given bytes that are not the md quote layout #when parsed #then null", () => {
|
|
181
|
+
expect(parseRenderedQuote("plain text [S4]")).toBeNull()
|
|
182
|
+
})
|
|
183
|
+
})
|