clearotron 0.3.2-beta.7 → 0.3.2-beta.9

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.
Files changed (272) hide show
  1. package/.env.example +58 -26
  2. package/CONTRIBUTING.md +8 -8
  3. package/INSTALL.md +148 -81
  4. package/README.md +3 -3
  5. package/SECURITY.md +3 -3
  6. package/bin/brandowner.mjs +3 -3
  7. package/bin/framework-preflight.mjs +1 -1
  8. package/bin/onboard.mjs +637 -216
  9. package/bin/start.mjs +151 -27
  10. package/bin/update.mjs +58 -11
  11. package/build-info.json +2 -2
  12. package/docs/DELIVERY.md +2 -1
  13. package/docs/INTAKE.md +1 -1
  14. package/docs/ONBOARDING.md +1 -1
  15. package/docs/architecture/03-run-lifecycle.md +6 -6
  16. package/docs/architecture/04-configuration-reference.md +32 -14
  17. package/docs/architecture/05-config-governance.md +23 -8
  18. package/docs/architecture/05-customer-profiles.md +2 -2
  19. package/docs/architecture/06-operations-runbook.md +3 -3
  20. package/docs/architecture/08-development-guide.md +6 -6
  21. package/docs/configuration.md +5 -5
  22. package/docs/decisions/0003-credential-model.md +1 -1
  23. package/docs/writing-standard.md +4 -0
  24. package/driver/CHANGELOG.md +124 -0
  25. package/driver/README.md +3 -3
  26. package/driver/band-size.mjs +59 -0
  27. package/driver/binding-layers.mjs +1 -1
  28. package/driver/citation-census.json +3 -3
  29. package/driver/{prelim-variants-record.mjs → clearance-variants-record.mjs} +24 -24
  30. package/driver/common-law-receipts.mjs +2 -2
  31. package/driver/company-bundle.mjs +3 -3
  32. package/driver/compose-read.mjs +8 -14
  33. package/driver/config-inventory.mjs +112 -9
  34. package/driver/consumption-ledger.mjs +2 -2
  35. package/driver/contract-arm2-baseline.json +2 -5
  36. package/driver/contract-dictation-registry.mjs +19 -19
  37. package/driver/contract-e3-backlog.mjs +43 -43
  38. package/driver/contract-e3-baseline.json +14 -14
  39. package/driver/contract-vocabulary.mjs +68 -27
  40. package/driver/deliver-trigger.sh +16 -16
  41. package/driver/demo-container.mjs +3 -3
  42. package/driver/dev-portal.mjs +3 -3
  43. package/driver/disposition-call.mjs +1 -1
  44. package/driver/door-gates.mjs +41 -7
  45. package/driver/doubt-ledger.mjs +2 -2
  46. package/driver/drainer-identity.mjs +34 -8
  47. package/driver/driver.config.mjs +367 -104
  48. package/driver/engine/CONTRACT.md +10 -3
  49. package/driver/engine/README.md +2 -2
  50. package/driver/engine/anthropic-agent.mjs +77 -21
  51. package/driver/engine/auth.mjs +129 -10
  52. package/driver/engine/jx-turn.mjs +7 -6
  53. package/driver/engine/mcp/README.md +1 -1
  54. package/driver/engine/mcp/dispositions-server.mjs +3 -3
  55. package/driver/engine/mcp/gather-config.mjs +9 -9
  56. package/driver/engine/mcp/perplexity-server.mjs +2 -2
  57. package/driver/engine/mcp/recording-server.mjs +18 -5
  58. package/driver/engine/openai-agent.mjs +4 -2
  59. package/driver/engine/probe.mjs +110 -23
  60. package/driver/enqueue-schema.mjs +6 -2
  61. package/driver/findings-model.mjs +6 -3
  62. package/driver/flag-snapshot.mjs +34 -8
  63. package/driver/form-neighbourhood.mjs +54 -7
  64. package/driver/framework.mjs +4 -4
  65. package/driver/gateway.mjs +36 -24
  66. package/driver/jx-lanes.mjs +23 -4
  67. package/driver/jx-units.mjs +7 -4
  68. package/driver/jx.mjs +34 -4
  69. package/driver/knockout-review-record.mjs +56 -4
  70. package/driver/known-conflicts.mjs +1 -1
  71. package/driver/matter-frame-record.mjs +90 -1
  72. package/driver/named-band.mjs +1 -1
  73. package/driver/ordinary-words.mjs +51 -0
  74. package/driver/outbox-backoff.mjs +31 -16
  75. package/driver/package.json +1 -1
  76. package/driver/partial-payload-baseline.json +2 -2
  77. package/driver/phase0.mjs +3 -3
  78. package/driver/pipeline-knockout.mjs +5 -5
  79. package/driver/pipeline.mjs +396 -81
  80. package/driver/placement-form.mjs +77 -1
  81. package/driver/placement-model.mjs +1 -1
  82. package/driver/portal-config-view.mjs +30 -1
  83. package/driver/portal-report.mjs +107 -6
  84. package/driver/portal-service.mjs +80 -14
  85. package/driver/portal-upstream.mjs +1 -1
  86. package/driver/predelivery-lint.mjs +12 -2
  87. package/driver/preserve-merge.mjs +3 -3
  88. package/driver/product-rows.mjs +2 -2
  89. package/driver/products.mjs +1 -1
  90. package/driver/profiles/README.md +3 -3
  91. package/driver/profiles/demo-brand-owner.json +2 -2
  92. package/driver/profiles.mjs +55 -17
  93. package/driver/progress.mjs +18 -8
  94. package/driver/provider-usage.mjs +8 -8
  95. package/driver/publish/index.mjs +154 -8
  96. package/driver/publish/knockout.mjs +39 -5
  97. package/driver/publish/pool-admin.mjs +1 -1
  98. package/driver/publish/publish-inputs.mjs +18 -2
  99. package/driver/publish/render-knockout.mjs +184 -31
  100. package/driver/publish/render.mjs +323 -93
  101. package/driver/publish/report-data.mjs +4 -1
  102. package/driver/publish/report-topbar.mjs +58 -0
  103. package/driver/publish/search-depth.mjs +133 -4
  104. package/driver/publish/templates/report.css +78 -4
  105. package/driver/publish/xlsx.mjs +20 -1
  106. package/driver/queue-order.mjs +2 -2
  107. package/driver/recording-agreement.mjs +1 -1
  108. package/driver/reference-score.mjs +1 -1
  109. package/driver/register-availability.mjs +2 -2
  110. package/driver/register-count.mjs +50 -5
  111. package/driver/register-coverage.mjs +161 -1
  112. package/driver/register-digest-record.mjs +236 -11
  113. package/driver/register-grant-vocabulary.mjs +1 -1
  114. package/driver/register-plan.mjs +189 -2
  115. package/driver/registry-fidelity.mjs +3 -3
  116. package/driver/repair-composers.mjs +1 -1
  117. package/driver/repair-contract.mjs +1 -1
  118. package/driver/replay-archive.mjs +6 -6
  119. package/driver/report-overview-record.mjs +2 -2
  120. package/driver/result-noun-fields.mjs +2 -2
  121. package/driver/run-economics.mjs +41 -10
  122. package/driver/run-requirements.mjs +173 -9
  123. package/driver/runner.mjs +5 -5
  124. package/driver/scope-facts.mjs +20 -5
  125. package/driver/scope-ledger.mjs +5 -5
  126. package/driver/search-policy.mjs +22 -12
  127. package/driver/skills/README.md +15 -15
  128. package/driver/skills/blind-frame/SKILL.md +2 -2
  129. package/driver/skills/case-law-citation/SKILL.md +4 -4
  130. package/driver/skills/case-law-citation/sources/eurlex.md +1 -1
  131. package/driver/skills/{prelim-common-law → clearance-common-law}/SKILL.md +22 -22
  132. package/driver/skills/{prelim-common-law → clearance-common-law}/perplexity-prompts.md +1 -1
  133. package/driver/skills/{prelim-register → clearance-register}/SKILL.md +10 -10
  134. package/driver/skills/{prelim-register → clearance-register}/digest.md +2 -2
  135. package/driver/skills/{prelim-register → clearance-register}/providers/README.md +1 -1
  136. package/driver/skills/{prelim-register → clearance-register}/providers/clarivate.md +37 -35
  137. package/driver/skills/{prelim-register → clearance-register}/providers/corsearch.md +20 -11
  138. package/driver/skills/{prelim-register → clearance-register}/providers/signa.md +5 -5
  139. package/driver/skills/{prelim-register → clearance-register}/register-recipes.md +3 -3
  140. package/driver/skills/{prelim-register → clearance-register}/status-rules.md +2 -2
  141. package/driver/skills/{prelim-register → clearance-register}/stealth-filer-indicators.md +1 -1
  142. package/driver/skills/{prelim-register → clearance-register}/unit.md +2 -2
  143. package/driver/skills/{prelim-search → clearance-search}/SKILL.md +31 -31
  144. package/driver/skills/{prelim-search → clearance-search}/delivery-contract.md +1 -1
  145. package/driver/skills/{prelim-search → clearance-search}/phase2-execution.md +18 -18
  146. package/driver/skills/{prelim-search → clearance-search}/synthesis-rules.md +7 -7
  147. package/driver/skills/{prelim-variants → clearance-variants}/SKILL.md +18 -18
  148. package/driver/skills/{prelim-variants → clearance-variants}/transliteration-scripts.md +5 -5
  149. package/driver/skills/frame-diff/SKILL.md +1 -1
  150. package/driver/skills/knockout-assess/SKILL.md +10 -7
  151. package/driver/skills/matter-frame/SKILL.md +3 -3
  152. package/driver/skills/narrative-refutation/SKILL.md +9 -9
  153. package/driver/skills/placement-inquiry/SKILL.md +5 -5
  154. package/driver/stage-context.mjs +1 -1
  155. package/driver/stages-knockout.mjs +4 -4
  156. package/driver/stages.mjs +65 -61
  157. package/driver/status-snapshot.mjs +2 -2
  158. package/driver/suite-census.json +340 -136
  159. package/driver/surface-exit-verdict.mjs +58 -0
  160. package/driver/systemd/README.md +9 -6
  161. package/driver/systemd/clearotron-worker.service +1 -1
  162. package/driver/terminal-clamp.mjs +109 -1
  163. package/driver/tokens.mjs +169 -3
  164. package/driver/unit-environment.mjs +42 -15
  165. package/driver/unit-inventory.mjs +19 -2
  166. package/driver/usage-ledger.mjs +1 -1
  167. package/driver/variant-manifest-model.mjs +4 -4
  168. package/driver/verify-knockout.mjs +27 -0
  169. package/driver/verify.mjs +94 -6
  170. package/driver/whatif-queue.mjs +1 -1
  171. package/driver/wordlists/en.txt +63906 -0
  172. package/mcp-server/CHANGELOG.md +8 -0
  173. package/mcp-server/README.md +1 -1
  174. package/mcp-server/lib/README.md +1 -1
  175. package/mcp-server/lib/options.mjs +8 -7
  176. package/mcp-server/lib/plan.mjs +18 -2
  177. package/mcp-server/lib/runs.mjs +1 -1
  178. package/mcp-server/lib/usage.mjs +3 -3
  179. package/mcp-server/lib/whatif.mjs +1 -1
  180. package/mcp-server/package.json +1 -1
  181. package/mcp-server/server.mjs +18 -1
  182. package/package.json +12 -11
  183. package/portal-ui/dist/assets/{index-CVOIvdhc.css → index-CtvwLCti.css} +207 -3
  184. package/portal-ui/dist/assets/{index-5UyqAyNM.js → index-EVaSo5-g.js} +1580 -527
  185. package/portal-ui/dist/index.html +2 -2
  186. package/portal-ui/package.json +1 -1
  187. package/providers/README.md +1 -1
  188. package/providers/_shared/enumerate.mjs +6 -6
  189. package/providers/_shared/execute-plan.mjs +3 -3
  190. package/providers/_shared/ledger.mjs +119 -5
  191. package/providers/_shared/provider-text.mjs +2 -2
  192. package/providers/_shared/screen.mjs +2 -2
  193. package/providers/_shared/script-form.mjs +3 -3
  194. package/providers/_shared/territory-codes.mjs +23 -3
  195. package/providers/clarivate/README.md +1 -1
  196. package/providers/clarivate/src/capabilities.js +12 -12
  197. package/providers/clarivate/src/core.js +37 -43
  198. package/providers/corsearch/README.md +1 -1
  199. package/providers/corsearch/src/capabilities.js +5 -5
  200. package/providers/corsearch/src/core.js +3 -3
  201. package/providers/jx/README.md +2 -1
  202. package/providers/jx/src/turn-envelope.mjs +8 -3
  203. package/providers/oauth-mcp-bridge/CHANGELOG.md +8 -0
  204. package/providers/oauth-mcp-bridge/package.json +1 -1
  205. package/providers/perplexity/src/core.js +1 -1
  206. package/providers/signa/README.md +1 -1
  207. package/providers/signa/src/capabilities.js +42 -49
  208. package/providers/signa/src/core.js +106 -29
  209. package/providers/uspto-local/README.md +1 -1
  210. package/providers/uspto-local/src/sync.js +1 -1
  211. package/scripts/README.md +1 -0
  212. package/scripts/ask-ai-render-check.mjs +127 -1
  213. package/scripts/authority-boundary-probe.mjs +8 -6
  214. package/scripts/backfill-started-at.mjs +2 -2
  215. package/scripts/census-merge-driver.mjs +33 -2
  216. package/scripts/citation-anchor-report.mjs +181 -0
  217. package/scripts/dead-names.mjs +1 -1
  218. package/scripts/deprecate-below.mjs +66 -8
  219. package/scripts/drain-preflight.mjs +1 -1
  220. package/scripts/e2e.mjs +174 -0
  221. package/scripts/env-audit.mjs +39 -6
  222. package/scripts/env-classify.mjs +20 -2
  223. package/scripts/freeze-example-run.mjs +61 -18
  224. package/scripts/generated-files-are-current.mjs +69 -4
  225. package/scripts/live-surface-check.mjs +124 -41
  226. package/scripts/markdown-link-check.mjs +1 -1
  227. package/scripts/merge-shape-check.mjs +242 -0
  228. package/scripts/mint-names-in-force.mjs +5 -5
  229. package/scripts/mint-offered-territories.mjs +72 -0
  230. package/scripts/mint-public-residue.mjs +2 -2
  231. package/scripts/mint-reference-strip-backlog.mjs +2 -2
  232. package/scripts/mint-suite-census.mjs +75 -2
  233. package/scripts/mint-writing-standard-backlog.mjs +2 -2
  234. package/scripts/purge-runs.mjs +7 -7
  235. package/scripts/reconcile-runs.mjs +2 -2
  236. package/scripts/release-approve-parked.mjs +20 -2
  237. package/scripts/release-await-cut.mjs +120 -1
  238. package/scripts/release-note-required.mjs +76 -8
  239. package/scripts/report-header-render-check.mjs +164 -0
  240. package/scripts/settings-render-check.mjs +75 -2
  241. package/scripts/test-full.mjs +96 -3
  242. package/scripts/test-run.mjs +10 -0
  243. package/shared/brand.mjs +27 -0
  244. package/shared/connect-clients.mjs +39 -11
  245. package/shared/deployment-box.mjs +7 -2
  246. package/shared/driver-dir.mjs +1 -1
  247. package/shared/env-aliases.mjs +1 -1
  248. package/shared/identifier-scan.mjs +65 -9
  249. package/shared/identifier-sentinels.mjs +22 -0
  250. package/shared/names-in-force.mjs +4 -2
  251. package/shared/offered-territories.json +738 -0
  252. package/shared/pre-rename-spellings.mjs +53 -0
  253. package/shared/reference-guard-classes.mjs +40 -2
  254. package/shared/stdio-connect.mjs +39 -4
  255. package/shared/tree-commit.mjs +48 -0
  256. /package/driver/skills/{prelim-register → clearance-register}/providers/euipo.md +0 -0
  257. /package/driver/skills/{prelim-register → clearance-register}/providers/free-tier.md +0 -0
  258. /package/driver/skills/{prelim-register → clearance-register}/providers/uspto-local.md +0 -0
  259. /package/driver/skills/{prelim-search → clearance-search}/field-doctrine-pharma.md +0 -0
  260. /package/driver/skills/{prelim-search → clearance-search}/firm-wide-reasoning.md +0 -0
  261. /package/driver/skills/{prelim-search → clearance-search}/report-prose.md +0 -0
  262. /package/driver/skills/{prelim-search → clearance-search}/risk-framework-demo.manifest.json +0 -0
  263. /package/driver/skills/{prelim-search → clearance-search}/risk-framework-demo.md +0 -0
  264. /package/driver/skills/{prelim-search → clearance-search}/risk-framework-triage.manifest.json +0 -0
  265. /package/driver/skills/{prelim-search → clearance-search}/risk-framework-triage.md +0 -0
  266. /package/driver/skills/{prelim-search → clearance-search}/risk-framework.manifest.json +0 -0
  267. /package/driver/skills/{prelim-search → clearance-search}/risk-framework.md +0 -0
  268. /package/driver/skills/{prelim-search → clearance-search}/template-formatting.md +0 -0
  269. /package/driver/skills/{prelim-search → clearance-search}/templates/email/generic.md +0 -0
  270. /package/driver/skills/{prelim-search → clearance-search}/templates/search-request-form.html +0 -0
  271. /package/driver/skills/{prelim-search → clearance-search}/worked-examples-demo.md +0 -0
  272. /package/driver/skills/{prelim-search → clearance-search}/worked-examples.md +0 -0
@@ -1,6 +1,6 @@
1
1
  # Transliteration scripts — reference
2
2
 
3
- Non-Latin scripts to consider when the jurisdiction scope is multi-region or worldwide. Generated by Claude directly during Step 5 of `prelim-variants`. Verification is a human step when transliterations produce hits.
3
+ Non-Latin scripts to consider when the jurisdiction scope is multi-region or worldwide. Generated by Claude directly during Step 5 of `clearance-variants`. Verification is a human step when transliterations produce hits.
4
4
 
5
5
  ## When to generate
6
6
 
@@ -24,7 +24,7 @@ For specific country lists, the orchestrator passes the jurisdiction list throug
24
24
  - **Meaning example (a SET, never one guess — see the rule below):** "Lumengarde" → 永光 · 长明 · 恒光 (everyday "everlasting light" first, then literal/adjacent) — derive the set from the concept, do not template these characters
25
25
  - **When to use phonetic:** when the brand is itself a coined / non-translatable word (Nike, Aureon)
26
26
  - **When to use meaning:** when the brand has clear English semantic content (Apple, Lumengarde)
27
- - **Meaning = the everyday-word-first equivalence SET, never one technical guess** (this *supersedes* the earlier "specific concept only / drop the everyday word" rule). Generate the small deterministic SET of natural-language renderings of the concept, **common-usage first**, then technical, then adjacent — e.g. COLORA → CN **色彩, 颜色** (everyday "colour") · **色度** (technical "chromaticity") · **彩度 / 色相** (adjacent) — tagging each member's register (everyday | technical | adjacent). **Never drop the everyday word because it looks saturated.** A saturated everyday-word count is the signal to *narrow to the field*, not to abandon the word: the register layer scopes the saturated token to the matter's filed in-scope Nice classes (a structured class × region filter — the token stays the substring predicate; goods-vocabulary words are never ANDed into the search text) and enumerates that (see [`prelim-register` register-recipes.md](../prelim-register/register-recipes.md) saturated-field handling). The everyday word is exactly what local registrants file and what the reviewing lawyer searches, so a common word is never grounds to skip it — or to drop a live in-class hit behind it. (Dropping the everyday word dodges the saturation noise but discards the real conflict hiding in the crowd.)
27
+ - **Meaning = the everyday-word-first equivalence SET, never one technical guess** (this *supersedes* the earlier "specific concept only / drop the everyday word" rule). Generate the small deterministic SET of natural-language renderings of the concept, **common-usage first**, then technical, then adjacent — e.g. COLORA → CN **色彩, 颜色** (everyday "colour") · **色度** (technical "chromaticity") · **彩度 / 色相** (adjacent) — tagging each member's register (everyday | technical | adjacent). **Never drop the everyday word because it looks saturated.** A saturated everyday-word count is the signal to *narrow to the field*, not to abandon the word: the register layer scopes the saturated token to the matter's filed in-scope Nice classes (a structured class × region filter — the token stays the substring predicate; goods-vocabulary words are never ANDed into the search text) and enumerates that (see [`clearance-register` register-recipes.md](../clearance-register/register-recipes.md) saturated-field handling). The everyday word is exactly what local registrants file and what the reviewing lawyer searches, so a common word is never grounds to skip it — or to drop a live in-class hit behind it. (Dropping the everyday word dodges the saturation noise but discards the real conflict hiding in the crowd.)
28
28
  - **Risk:** Chinese mark registrations sometimes file BOTH. Always generate both for high-tier matters
29
29
  - **Verification:** Claude generates plausibly but the reviewing lawyer or local counsel should confirm before any output reaches the client
30
30
 
@@ -88,7 +88,7 @@ For specific country lists, the orchestrator passes the jurisdiction list throug
88
88
 
89
89
  1. **One PHONETIC transliteration per script per mark element.** Don't generate exhaustive phonetic variant sets within a single script — pick the most likely. (Meaning translations are the exception — see 2b.)
90
90
  2. **For Chinese: generate phonetic AND meaning translations** for any mark with clear semantic content. One entry (phonetic only) for coined marks.
91
- 2b. **Meaning translation = the everyday-word-first equivalence SET (it reverses the older "specific concept, drop the everyday word" rule).** Emit the small deterministic set common-usage first, then technical, then adjacent — one manifest row per member, each tagged with its register (everyday | technical | adjacent). **Never drop the everyday word for looking saturated:** saturation is handled downstream by class-scoped enumeration in the register layer ([register-recipes.md](../prelim-register/register-recipes.md)) — the token narrowed to the filed in-scope Nice classes, not by ANDing goods words into the query and not by abandoning the word. A common everyday word is never grounds to skip a meaning rendering or to drop a live in-class hit behind it.
91
+ 2b. **Meaning translation = the everyday-word-first equivalence SET (it reverses the older "specific concept, drop the everyday word" rule).** Emit the small deterministic set common-usage first, then technical, then adjacent — one manifest row per member, each tagged with its register (everyday | technical | adjacent). **Never drop the everyday word for looking saturated:** saturation is handled downstream by class-scoped enumeration in the register layer ([register-recipes.md](../clearance-register/register-recipes.md)) — the token narrowed to the filed in-scope Nice classes, not by ANDing goods words into the query and not by abandoning the word. A common everyday word is never grounds to skip a meaning rendering or to drop a live in-class hit behind it.
92
92
  3. **Tag the variant row** in the Variants table with the category `translit-<script>` (e.g. `translit-cjk-japanese`, `translit-arabic`) and a rationale explaining whether it's phonetic or meaning-based. **For Chinese the category token MUST carry the sense** — `translit-zh-meaning` for a meaning translation, `translit-zh-phonetic` for a phonetic one — because the downstream saturation / class-scoped-enumeration gates key on the `translit-*-meaning` tag; a meaning row tagged only `translit-zh` would silently skip the field-narrowing and revert to the old drop-on-saturation behaviour.
93
93
  4. **Flag for verification** by putting `✅` in the Variants table's `Verify?` column for every transliteration row. The downstream skill marks any HIT against these variants as needing reviewer sign-off before inclusion in the deliverable.
94
94
  5. **Every non-Latin row carries its ROMANISATION, on its own row** — `"romanization"` in the manifest's structured sibling, and the Latin form in parentheses in the prose row's rationale. This is not decoration: **half the registers we search hold a non-Latin filing ONLY under its transliteration and cannot answer the characters at all.** A row without one is a term that can be searched on some providers and on no others — and the one that refuses it is right to, because searching the characters there returns 0 with no error and reads as a clean. (A clearance run on 2026-07-29 compiled thirteen native-script terms with no romanisation; every one was refused and the transliteration axis produced no coverage.) Rules: plain ASCII letters and digits, syllable-separated by single spaces, no tone marks and no diacritics (华威豹 → `HUA WEI BAO`, ティキスラッシュ → `TIKI SURASSHU`, 티키 슬러시 → `TIKI SEULLEOSI`, Тики Слаш → `TIKI SLASH`); the romanisation goes on the row whose own value it romanises, never on a neighbour and never as a row of its own; and a value that is already Latin never gets one. The driver puts BOTH forms on the search entry and each provider expresses the one its index holds — you state the pair, you never choose which gets searched.
@@ -97,7 +97,7 @@ For specific country lists, the orchestrator passes the jurisdiction list throug
97
97
 
98
98
  Skip transliteration for:
99
99
  - Single-jurisdiction searches in a Latin-script country
100
- - Internal sanity-check / brainstorm runs (the standalone mode of `prelim-variants`)
100
+ - Internal sanity-check / brainstorm runs (the standalone mode of `clearance-variants`)
101
101
  - Matters where the client explicitly excludes non-Latin markets
102
102
 
103
103
  When in doubt: generate them. Cost is one extra dozen rows in the variant manifest, but missing a Japanese katakana hit on a global launch is the kind of miss that gets noticed post-launch.
@@ -106,7 +106,7 @@ When in doubt: generate them. Cost is one extra dozen rows in the variant manife
106
106
 
107
107
  - Trade name vs trademark distinctions in non-Latin markets (handled by local counsel)
108
108
  - Honorific / corporate-suffix conventions (Pvt Ltd in India, AG in German, GmbH in German, K.K. in Japan)
109
- - Right-to-left text rendering for Arabic in the deliverable Excel — output handling is in `prelim-search`'s Excel writer
109
+ - Right-to-left text rendering for Arabic in the deliverable Excel — output handling is in `clearance-search`'s Excel writer
110
110
  - Native-language semantic equivalents that aren't transliterations (e.g., the Chinese meaning SET 永光 · 长明 is a TRANSLATION, not a transliteration — but we include both under this file's umbrella for practical reasons)
111
111
 
112
112
  ## Open questions for the reviewing lawyer
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: frame-diff
3
- description: The omission detector for the v3 preliminary trademark search workflow. **Invoked exclusively by the `prelim-search` orchestrator/driver** once the register sweeps have landed and before placement runs — do not call directly. Diffs the blind (frame-starved) re-derivation against what the run ACTUALLY scoped and searched, and emits structured reopen directives — one per variant / field / source omission worth acting on, each carrying the observation that should reopen it and a severity. The driver acts on the directives (a targeted supplemental sweep, then re-digest) and on the dominant-element gap (it can block a clean finding). The decision is the driver's; you supply the structured diff.
3
+ description: The omission detector for the v3 preliminary trademark search workflow. **Invoked exclusively by the `clearance-search` orchestrator/driver** once the register sweeps have landed and before placement runs — do not call directly. Diffs the blind (frame-starved) re-derivation against what the run ACTUALLY scoped and searched, and emits structured reopen directives — one per variant / field / source omission worth acting on, each carrying the observation that should reopen it and a severity. The driver acts on the directives (a targeted supplemental sweep, then re-digest) and on the dominant-element gap (it can block a clean finding). The decision is the driver's; you supply the structured diff.
4
4
  ---
5
5
 
6
6
  ## Purpose
@@ -36,7 +36,7 @@ there is no other value: a band that needs sharpening is the band above it, stat
36
36
  This ordered an expectation sentence ("moderate volume of filings expected") and forbade a register
37
37
  conclusion, because this seat could not see the register lane. It can: the run's fetched records are
38
38
  passed to you when they exist. The replacement is RF-15 v3 in
39
- `../prelim-search/firm-wide-reasoning.md` — estimation becomes one of three confirmation states once
39
+ `../clearance-search/firm-wide-reasoning.md` — estimation becomes one of three confirmation states once
40
40
  the register actually ran. Where it did not run, the estimate is still the honest answer and RF-15
41
41
  says so.
42
42
  *The number is kept and not reused* — see calibration rule 4 for why.
@@ -51,7 +51,7 @@ there is no other value: a band that needs sharpening is the band above it, stat
51
51
  2. **Crowded field = diluted risk, not amplified.** Many small, non-enforcing players means any one
52
52
  player's enforcement power is weaker — a crowded field typically caps at the middle band. The
53
53
  gating precondition, and what a crowd may and may not do to a band, are in
54
- `../prelim-search/firm-wide-reasoning.md` → *Volume is not a risk multiplier*; read it there rather
54
+ `../clearance-search/firm-wide-reasoning.md` → *Volume is not a risk multiplier*; read it there rather
55
55
  than from a summary here.
56
56
  *(Its closing sentence — "the top bands are reserved for dominant, well-resourced,
57
57
  known-to-enforce rights holders" — is RETIRED. That is owner size and fame driving a band, which the
@@ -78,7 +78,7 @@ there is no other value: a band that needs sharpening is the band above it, stat
78
78
  This rule ordered the pending-register caveat on *every* summary, unconditionally. When the register
79
79
  ran and surfaced live filings, that sentence tells a client its ratings are common-law only while the
80
80
  same run holds the filings — which is what shipped. The replacement is RF-10 v3 in
81
- `../prelim-search/firm-wide-reasoning.md`: when register analysis ran AND surfaced live filings, drop
81
+ `../clearance-search/firm-wide-reasoning.md`: when register analysis ran AND surfaced live filings, drop
82
82
  the caveat and cite the register evidence directly; otherwise it stands.
83
83
  *The number is kept and not reused.* `verify-knockout.mjs` and two other files address these rules by
84
84
  number, so renumbering would silently repoint five live references at the wrong rule.5. **Dispute-type notation only when the customer's framework defines it** (e.g. an A–E / dispute
@@ -122,9 +122,8 @@ each mark, and — when the register component is configured — two counts per
122
122
  identical to the name, and how many contain it. That is the whole evidence base. Everything below
123
123
  follows from writing only what it supports.
124
124
 
125
- 1. **A survivor is never "clear".** A mark this screen did not knock out is *not knocked out at the
126
- configured depth, and proceeds to clearance*. Never "clear", "clean", "no conflicts found", "clear
127
- to proceed". The screen ending without a blocker is a result about the screen, not about the mark.
125
+ 1. **A survivor is never "clear".** Never "clear", "clean", "no conflicts found", "clear to proceed".
126
+ The screen ending without a blocker is a result about the screen, not about the mark.
128
127
  2. **An absence claim may not exceed what was searched.** Say where you looked and what came back
129
128
  empty there — "no exact-name energy drink was identified in the supplement and grocery
130
129
  marketplaces screened" is supportable; "there is no conflicting use" is not. `negatives[]` is
@@ -236,7 +235,11 @@ A note that restates a finding already on the page is not a note. Cut it.
236
235
 
237
236
  Each mark's report is delivered on its own, and `assessment` is the first thing its reader meets —
238
237
  before any table. Write it for a client who ordered this one name and nothing else: what the name is,
239
- what the landscape around it looks like, what drives the rating, what to do with that.
238
+ what the landscape around it looks like, what drives the rating.
239
+
240
+ **No recommendation, and no next step.** Never say what to do with the name, whether it advances, or
241
+ what happens next — not under a heading of your own, and not as a closing line. The findings and the
242
+ rating are the whole of this read; the report's own caveat says what the screen is.
240
243
 
241
244
  **It names THIS mark and no other.** A sibling's name here is another client's mark on this client's
242
245
  page. The cross-mark reading is `chunkSummary`, and it has its own page.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: matter-frame
3
- description: Pre-flight reasoning step for trademark searches. Produces a structured matter-context.md naming the client + sector + customer base + channels of trade + materially-matters jurisdictions + off-field sectors + watchlist-owner seeds — before any search runs. Invoke at Phase 0 of prelim-search or a full clearance-search. The downstream workflow consumes this artifact at every step (variants generation, register sweep, placement inquiry, narrative refutation) so the matter's commercial context stops being implicit and starts being load-bearing.
3
+ description: Pre-flight reasoning step for trademark searches. Produces a structured matter-context.md naming the client + sector + customer base + channels of trade + materially-matters jurisdictions + off-field sectors + watchlist-owner seeds — before any search runs. Invoke at Phase 0 of clearance-search or a full clearance-search. The downstream workflow consumes this artifact at every step (variants generation, register sweep, placement inquiry, narrative refutation) so the matter's commercial context stops being implicit and starts being load-bearing.
4
4
  ---
5
5
 
6
6
  ## Purpose
@@ -13,7 +13,7 @@ This is structured inquiry, not rule application. You are reasoning, not classif
13
13
 
14
14
  Phase 0 of any trademark search workflow, after the request has been parsed (mark, classes, manner of use, client, requester) and before variants generation. One Opus inline call, no tool budget, no spawned workers.
15
15
 
16
- Invoked from `prelim-search` (orchestrator) at Phase 0, before `prelim-variants`. Reusable by a future clearance-search at the equivalent step.
16
+ Invoked from `clearance-search` (orchestrator) at Phase 0, before `clearance-variants`. Reusable by a future clearance-search at the equivalent step.
17
17
 
18
18
  ## Model
19
19
 
@@ -84,7 +84,7 @@ Two scopes live here, and the doctrine is **narrow at citation, never silently a
84
84
  - **Excluded.** Territories you considered and set aside — neither instructed, nor brand-signalled, nor a major on a worldwide matter — name each, the reason, and a **reopen trigger** (a right or signal pointing there surfaces). A hit effective ONLY outside the scope set is out of *citation* scope (drop it from findings); but a market the brand actually signals belongs in the SEARCH set, not here.
85
85
  - **Primary vs only.** If the instruction names territories of "primary" / "first" interest WITHOUT "only", treat the named ones as the citation core but **let the search lean wide** to the majors / brand-signalled markets (the "primary" wording signals more may matter), and **record the assumption** — a one-line `Scope assumption: <text>`. (A single clarifying question is acceptable instead; the recorded default never blocks the run.)
86
86
  - **Send the structured scope as FIELDS** (the downstream sweep + `frame-diff` consume it): `scope_jurisdictions` — the SEARCH set as short codes (EU / US / CN / CH …), including the majors / signalled markets when leaning wide and any `in-scope-by-reach` ones; `excluded_jurisdictions` when any were set aside; and `scope_basis` as `instructed | worldwide | inferred`, so synthesis knows whether a narrowing was disclosed. The driver renders the lines.
87
- - This set drives the per-jurisdiction sub-queries AND the major-jurisdiction floor in `prelim-register`; `frame-diff` checks it both ways (a citation outside the scope set = over-reach; a material market in the set left unsearched = under-coverage — disclosed + clamped, never a silent clean).
87
+ - This set drives the per-jurisdiction sub-queries AND the major-jurisdiction floor in `clearance-register`; `frame-diff` checks it both ways (a citation outside the scope set = over-reach; a material market in the set left unsearched = under-coverage — disclosed + clamped, never a silent clean).
88
88
 
89
89
  *Worked illustrations:*
90
90
  *— Instructed "Switzerland and the EU, only" → search CH + the EUTM/EU layer (+ any Madrid designation reaching them); majors beyond (CN/JP/US/UK) are out of scope — an honored narrow instruction (`Scope basis: instructed`).*
@@ -15,9 +15,9 @@ This is structured refutation, not approval. Your job is to find what's wrong, n
15
15
 
16
16
  ## When invoked
17
17
 
18
- Spawned between Step 4 synthesis (narrative composition) and Phase 3 delivery. Different session, clean context. Reads multiple inputs, writes one output. Phase 3 consumes the verdict — BLOCKING drives one corrective re-synthesis; the report is then **always delivered**, with any unresolved reviewer concerns surfaced to the reviewing lawyer as open questions (the driver never withholds — see `prelim-search` Phase 3).
18
+ Spawned between Step 4 synthesis (narrative composition) and Phase 3 delivery. Different session, clean context. Reads multiple inputs, writes one output. Phase 3 consumes the verdict — BLOCKING drives one corrective re-synthesis; the report is then **always delivered**, with any unresolved reviewer concerns surfaced to the reviewing lawyer as open questions (the driver never withholds — see `clearance-search` Phase 3).
19
19
 
20
- The orchestrator (`prelim-search`) spawns this worker at the equivalent step. Reusable by a future clearance-search at the equivalent step.
20
+ The orchestrator (`clearance-search`) spawns this worker at the equivalent step. Reusable by a future clearance-search at the equivalent step.
21
21
 
22
22
  ## Model
23
23
 
@@ -28,11 +28,11 @@ The driver dispatches this as a stage with its own context and a 900-second wall
28
28
  ## Inputs you receive
29
29
 
30
30
  - The orchestrator's narrative (the client-facing email body / report content, passed inline in the spawn task)
31
- - `matter-context.md` at `studio/prelim-search/<slug>/<date>/matter-context.md` (the strategic framing from `matter-frame`)
32
- - `register-findings.md` at `studio/prelim-search/<slug>/<date>/register-findings.md` (the digest output with the digest's own candidate ordering)
33
- - `common-law-findings.md` at `studio/prelim-search/<slug>/<date>/common-law-findings.md` (the common-law digest)
34
- - `placement-recommendations.md` at `studio/prelim-search/<slug>/<date>/placement-recommendations.md` (the per-candidate placements from `placement-inquiry`) and its structured mirror `placements.json` beside it (`{mark, owner, jurisdiction, records, tier, reason}` per candidate; the md carries the rulings tail)
35
- - `variant-manifest.md` at `studio/prelim-search/<slug>/<date>/variant-manifest.md` (for completeness checks if relevant)
31
+ - `matter-context.md` at `studio/clearance-search/<slug>/<date>/matter-context.md` (the strategic framing from `matter-frame`)
32
+ - `register-findings.md` at `studio/clearance-search/<slug>/<date>/register-findings.md` (the digest output with the digest's own candidate ordering)
33
+ - `common-law-findings.md` at `studio/clearance-search/<slug>/<date>/common-law-findings.md` (the common-law digest)
34
+ - `placement-recommendations.md` at `studio/clearance-search/<slug>/<date>/placement-recommendations.md` (the per-candidate placements from `placement-inquiry`) and its structured mirror `placements.json` beside it (`{mark, owner, jurisdiction, records, tier, reason}` per candidate; the md carries the rulings tail)
35
+ - `variant-manifest.md` at `studio/clearance-search/<slug>/<date>/variant-manifest.md` (for completeness checks if relevant)
36
36
 
37
37
  ## Output — one call, not a file
38
38
 
@@ -119,7 +119,7 @@ and challenge it:
119
119
  element (or one materially like it) in a *comparable* situation — not a win on a different element, not a default
120
120
  against an obvious copycat. A risk-raising fact carrying no one-line "why this bears on this conflict", or opposed
121
121
  signals (e.g. enforcer **and** commercial partner) left listed in parallel rather than reconciled → **FLAG
122
- (probative-grading)** — per `prelim-search/firm-wide-reasoning.md` (*Mitigation factors*), such facts adjust the practical read, they do not raise the level.
122
+ (probative-grading)** — per `clearance-search/firm-wide-reasoning.md` (*Mitigation factors*), such facts adjust the practical read, they do not raise the level.
123
123
 
124
124
  These are *questions you must be able to answer from the facts*, not consistency checks against the upstream
125
125
  files. If the headline cannot be defended against them, it blocks.
@@ -282,7 +282,7 @@ This is the check for what was *never searched* — the gap a narrative-vs-files
282
282
 
283
283
  For any candidate the narrative escalates above a "distinguished by its own distinctive matter" dominant-element read (a house mark / distinctive prefix):
284
284
  - What theory is doing the escalation? It must be a **consumer-confusion** theory (e.g. evidence of actual confusion).
285
- - If the escalation rests on optics / PR / partner-sensitivity / audience overlap / owner size alone, **FLAG (optics-escalation)** — per `prelim-search/firm-wide-reasoning.md` (*Elevation factors*) the legal level is the confusion read; PR/relationship factors annotate, they do not raise the level. Suggest: hold the distinguished read and move the concern to the PR/reputational annotation.
285
+ - If the escalation rests on optics / PR / partner-sensitivity / audience overlap / owner size alone, **FLAG (optics-escalation)** — per `clearance-search/firm-wide-reasoning.md` (*Elevation factors*) the legal level is the confusion read; PR/relationship factors annotate, they do not raise the level. Suggest: hold the distinguished read and move the concern to the PR/reputational annotation.
286
286
 
287
287
  ### Variant-imagination audit (backstop — did the search even look for the obvious neighbours?)
288
288
 
@@ -19,7 +19,7 @@ You read the **complete named band** the funnel handed up; the funnel decided *n
19
19
 
20
20
  ## When invoked
21
21
 
22
- After register-unit workers and common-law workers have returned their findings (Phase 2 Step 2B end), BEFORE the digest worker (`prelim-register` MODE B) spawns to tier candidates. One Opus call (inline by the orchestrator), reads matter-context.md + the complete named band (through the band tools) + the common-law findings.
22
+ After register-unit workers and common-law workers have returned their findings (Phase 2 Step 2B end), BEFORE the digest worker (`clearance-register` MODE B) spawns to tier candidates. One Opus call (inline by the orchestrator), reads matter-context.md + the complete named band (through the band tools) + the common-law findings.
23
23
 
24
24
  ## Model
25
25
 
@@ -27,19 +27,19 @@ Inherits the orchestrator's tier when invoked inline. No `sessions_spawn` — th
27
27
 
28
28
  ## Inputs you receive
29
29
 
30
- - `matter-context.md` from `matter-frame` at `studio/prelim-search/<slug>/<date>/matter-context.md` (the strategic foundation — read it once, reference it throughout)
30
+ - `matter-context.md` from `matter-frame` at `studio/clearance-search/<slug>/<date>/matter-context.md` (the strategic foundation — read it once, reference it throughout)
31
31
  - **The complete named band** — read through the **band tools** (every call lands in the run's reading audit; never slice band files with shell). `band_shape` first: the deterministic shape of the complete merged band — totals, mechanical similarity tiers, **THE FLOORS** (every live in-class identical/near-identical record, listed individually and unconditionally — **every floor row must come back on your form, by record id.** Either you place it, or you select it with `tier: "out-of-scope-filtered"` and one line in `reason` saying why it is not a candidate. Discussing a floor in your prose is NOT accounting for it: the row is what the driver can check, and a floor you leave off the form is recorded as unanswered whatever the prose says. This is the one duty with no cap — see **Length target**, which bounds the general band and not this), census, owner concentrations, crowd descriptors, blind spots. A floors-heavy shape is served in PARTS (the response labels itself part N/M and names the next call) — read every part; a partial shape is never the shape. Then `band_lookup` / `band_record` for the records your inquiry needs. This is the funnel's real output, lifted across the firewall:
32
32
  - **enumerated records** — every named record the funnel paged to completion, each carrying `record_id, mark_text, classes, status, owner_name, owner_country, application_date, registration_date, expiry_date, jurisdictions, screen_verdict` (+ `_query` provenance). Apply the relevance / off-field gate over **this complete set** (work through the shape's totals slice by slice) — nothing was pre-sampled, so your gate is the *only* gate.
33
33
  - **`incomplete` crowd descriptors** — a query the funnel could NOT enumerate (genuinely too large, provider cap, budget): `query, total_hits, fetched, reason`. These are NOT findings and NOT clean negatives — they are signals you must rule on (cleared / material-gap; see "Crowd-descriptor materiality" below). They ride along on matching lookups too, so a counted-only zone can never read as a clean.
34
34
  - The unit's compact prose digest (`register-units/<axis>.md`) still exists for the audit trail; the **band is the material you judge.** Where they disagree, the band wins — it is the complete record, the prose is a summary.
35
- - The common-law-findings file at `studio/prelim-search/<slug>/<date>/common-law-findings.md` (common-law candidate inventory)
35
+ - The common-law-findings file at `studio/clearance-search/<slug>/<date>/common-law-findings.md` (common-law candidate inventory)
36
36
  - Any prior `placement-recommendations.md` from earlier rounds (for re-runs after a skeptic-flagged re-spawn)
37
37
 
38
38
  ## Output
39
39
 
40
40
  TWO files.
41
41
 
42
- **1. The markdown file** `studio/prelim-search/<slug>/<date>/placement-recommendations.md`. Use these section headings, in this order: **Band reconciliation** (the expectation-vs-band check), the four placement tiers (**Headline candidates**, **Sheet 2 / register watch**, **Watchlist annex**, **Out-of-scope / filtered**), **Disagreements / flags surfaced to downstream**, **Coverage rulings & open questions** (the per-crowd-descriptor cleared/material-gap rulings that feed synthesis `coverage_judgment`), and **Open questions for the client / reviewer** (genuine open judgment that ships).
42
+ **1. The markdown file** `studio/clearance-search/<slug>/<date>/placement-recommendations.md`. Use these section headings, in this order: **Band reconciliation** (the expectation-vs-band check), the four placement tiers (**Headline candidates**, **Sheet 2 / register watch**, **Watchlist annex**, **Out-of-scope / filtered**), **Disagreements / flags surfaced to downstream**, **Coverage rulings & open questions** (the per-crowd-descriptor cleared/material-gap rulings that feed synthesis `coverage_judgment`), and **Open questions for the client / reviewer** (genuine open judgment that ships).
43
43
 
44
44
  **Section anchor — copy it verbatim.** Directly under the FIRST of the four placement-tier headings,
45
45
  emit this line exactly as written, on its own line:
@@ -55,7 +55,7 @@ no reader ever sees it.
55
55
  **Word the headings however reads best.** The anchor is the contract; the heading text is yours. The
56
56
  order above is still the order to write them in, but you will not be failed for choosing other words.
57
57
 
58
- **2. The structured mirror** `studio/prelim-search/<slug>/<date>/placements.json` — the four tier sections as data: `{"schema_version":1,"placements":[...]}`, ONE object per placed candidate, keys EXACTLY `{"mark","owner","jurisdiction","records","tier","reason"}` plus the optional `"borderline"`:
58
+ **2. The structured mirror** `studio/clearance-search/<slug>/<date>/placements.json` — the four tier sections as data: `{"schema_version":1,"placements":[...]}`, ONE object per placed candidate, keys EXACTLY `{"mark","owner","jurisdiction","records","tier","reason"}` plus the optional `"borderline"`:
59
59
 
60
60
  - `mark` / `owner` — verbatim as in your md entry (downstream joins on mark + owner + jurisdiction)
61
61
  - `jurisdiction` — the office/territory; `""` where none applies
@@ -219,7 +219,7 @@ const UNDECLARED = {
219
219
  // because this list is a fact about gates rather than a convenience copy of `_driver/`.
220
220
  export const VALIDATOR_SIDECARS = {
221
221
  "matter-frame": ["instructed-scope.json", "stage-contracts.json"],
222
- "prelim-variants": ["instructed-scope.json", "stage-contracts.json"],
222
+ "clearance-variants": ["instructed-scope.json", "stage-contracts.json"],
223
223
  "register-unit": ["instructed-scope.json", "register-plan.json"],
224
224
  "common-law": ["grid-spec.json", "profile.json"],
225
225
  // — the DRIVER'S copy of the placement form. Without it in the sandbox an experiment arm would
@@ -289,14 +289,14 @@ export const KO_STAGES = {
289
289
  // the guards that read `STAGES.skillReads` walk the clearance lane's table, not this one — so the
290
290
  // effective read is the `reads([...])` call in the message and nothing checks that the two agree.
291
291
  // They are edited together and the asymmetry is written down rather than left to be discovered.
292
- skillReads: ["skills/knockout-assess/SKILL.md", "skills/prelim-search/firm-wide-reasoning.md"],
292
+ skillReads: ["skills/knockout-assess/SKILL.md", "skills/clearance-search/firm-wide-reasoning.md"],
293
293
  // out/validate are per-CHUNK; the merged knockout-findings.json is validated separately in code.
294
294
  out: (K, chunkNo) => K.assessChunk(chunkNo),
295
295
  validate: koValidators.knockoutAssessChunk,
296
296
  message: ({ K, chunkNo, chunkMarks, chunkTotal, framework, frameworkPath, probeNote }) => lines(
297
297
  // The deck path comes from ctx (attachKnockoutFramework resolves it once, on the fresh and the
298
298
  // resume path both) — never recomputed here, because "which deck" is one decision.
299
- reads(["skills/knockout-assess/SKILL.md", frameworkPath, "skills/prelim-search/firm-wide-reasoning.md"].filter(Boolean)),
299
+ reads(["skills/knockout-assess/SKILL.md", frameworkPath, "skills/clearance-search/firm-wide-reasoning.md"].filter(Boolean)),
300
300
  `You are rating chunk ${chunkNo + 1}/${chunkTotal} of a KNOCKOUT batch — triage, not clearance.`,
301
301
  `Rate ONLY these marks (one entry each, names verbatim): ${chunkMarks.map((m) => m.name).join(" · ")}.`,
302
302
  `The batch plan (context framing, classes, priorities): ${K.plan}`,
@@ -518,7 +518,7 @@ export const KO_STAGES = {
518
518
  // DECLARATIVE ONLY on this lane, exactly as the assess stage records: nothing in koStage reads
519
519
  // `skillReads`, and the effective read is the `reads([...])` call in the message below. The two are
520
520
  // edited together and the asymmetry is written down rather than left to be discovered.
521
- skillReads: ["skills/prelim-search/report-prose.md"],
521
+ skillReads: ["skills/clearance-search/report-prose.md"],
522
522
  out: (K) => K.review,
523
523
  validate: validateKnockoutReviewFile,
524
524
  // ── THE MESSAGE PROMISES A TABLE ONLY WHEN IT HAS ONE ──────────────────────────
@@ -531,7 +531,7 @@ export const KO_STAGES = {
531
531
  // exists to stop. The driver does not dispatch on an empty measurement; the branch is here because
532
532
  // "it cannot happen" is not a property a message should depend on.
533
533
  message: ({ K, evidenceLines = [], exclusionNote = "" }) => lines(
534
- reads(["skills/prelim-search/report-prose.md"]),
534
+ reads(["skills/clearance-search/report-prose.md"]),
535
535
  `You are the REVIEWING PASS on a knockout screen. The batch is already rated and nothing about that rating is yours to change. Your job is the words.`,
536
536
  `THE RULE. A line a reader meets before opening anything carries no legal or engine vocabulary and no sentence longer than 25 words. Inside a fold the lawyer's words are allowed where a plain one would lose precision; on a default-visible line they are not. The reader here is the client of the lawyer who ordered this screen, and they read the same page.`,
537
537
  `The rated record: ${K.findings}. Read it — the lines named below are quoted from it and you are rewriting them in place.`,