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.
- package/.env.example +58 -26
- package/CONTRIBUTING.md +8 -8
- package/INSTALL.md +148 -81
- package/README.md +3 -3
- package/SECURITY.md +3 -3
- package/bin/brandowner.mjs +3 -3
- package/bin/framework-preflight.mjs +1 -1
- package/bin/onboard.mjs +637 -216
- package/bin/start.mjs +151 -27
- package/bin/update.mjs +58 -11
- package/build-info.json +2 -2
- package/docs/DELIVERY.md +2 -1
- package/docs/INTAKE.md +1 -1
- package/docs/ONBOARDING.md +1 -1
- package/docs/architecture/03-run-lifecycle.md +6 -6
- package/docs/architecture/04-configuration-reference.md +32 -14
- package/docs/architecture/05-config-governance.md +23 -8
- package/docs/architecture/05-customer-profiles.md +2 -2
- package/docs/architecture/06-operations-runbook.md +3 -3
- package/docs/architecture/08-development-guide.md +6 -6
- package/docs/configuration.md +5 -5
- package/docs/decisions/0003-credential-model.md +1 -1
- package/docs/writing-standard.md +4 -0
- package/driver/CHANGELOG.md +124 -0
- package/driver/README.md +3 -3
- package/driver/band-size.mjs +59 -0
- package/driver/binding-layers.mjs +1 -1
- package/driver/citation-census.json +3 -3
- package/driver/{prelim-variants-record.mjs → clearance-variants-record.mjs} +24 -24
- package/driver/common-law-receipts.mjs +2 -2
- package/driver/company-bundle.mjs +3 -3
- package/driver/compose-read.mjs +8 -14
- package/driver/config-inventory.mjs +112 -9
- package/driver/consumption-ledger.mjs +2 -2
- package/driver/contract-arm2-baseline.json +2 -5
- package/driver/contract-dictation-registry.mjs +19 -19
- package/driver/contract-e3-backlog.mjs +43 -43
- package/driver/contract-e3-baseline.json +14 -14
- package/driver/contract-vocabulary.mjs +68 -27
- package/driver/deliver-trigger.sh +16 -16
- package/driver/demo-container.mjs +3 -3
- package/driver/dev-portal.mjs +3 -3
- package/driver/disposition-call.mjs +1 -1
- package/driver/door-gates.mjs +41 -7
- package/driver/doubt-ledger.mjs +2 -2
- package/driver/drainer-identity.mjs +34 -8
- package/driver/driver.config.mjs +367 -104
- package/driver/engine/CONTRACT.md +10 -3
- package/driver/engine/README.md +2 -2
- package/driver/engine/anthropic-agent.mjs +77 -21
- package/driver/engine/auth.mjs +129 -10
- package/driver/engine/jx-turn.mjs +7 -6
- package/driver/engine/mcp/README.md +1 -1
- package/driver/engine/mcp/dispositions-server.mjs +3 -3
- package/driver/engine/mcp/gather-config.mjs +9 -9
- package/driver/engine/mcp/perplexity-server.mjs +2 -2
- package/driver/engine/mcp/recording-server.mjs +18 -5
- package/driver/engine/openai-agent.mjs +4 -2
- package/driver/engine/probe.mjs +110 -23
- package/driver/enqueue-schema.mjs +6 -2
- package/driver/findings-model.mjs +6 -3
- package/driver/flag-snapshot.mjs +34 -8
- package/driver/form-neighbourhood.mjs +54 -7
- package/driver/framework.mjs +4 -4
- package/driver/gateway.mjs +36 -24
- package/driver/jx-lanes.mjs +23 -4
- package/driver/jx-units.mjs +7 -4
- package/driver/jx.mjs +34 -4
- package/driver/knockout-review-record.mjs +56 -4
- package/driver/known-conflicts.mjs +1 -1
- package/driver/matter-frame-record.mjs +90 -1
- package/driver/named-band.mjs +1 -1
- package/driver/ordinary-words.mjs +51 -0
- package/driver/outbox-backoff.mjs +31 -16
- package/driver/package.json +1 -1
- package/driver/partial-payload-baseline.json +2 -2
- package/driver/phase0.mjs +3 -3
- package/driver/pipeline-knockout.mjs +5 -5
- package/driver/pipeline.mjs +396 -81
- package/driver/placement-form.mjs +77 -1
- package/driver/placement-model.mjs +1 -1
- package/driver/portal-config-view.mjs +30 -1
- package/driver/portal-report.mjs +107 -6
- package/driver/portal-service.mjs +80 -14
- package/driver/portal-upstream.mjs +1 -1
- package/driver/predelivery-lint.mjs +12 -2
- package/driver/preserve-merge.mjs +3 -3
- package/driver/product-rows.mjs +2 -2
- package/driver/products.mjs +1 -1
- package/driver/profiles/README.md +3 -3
- package/driver/profiles/demo-brand-owner.json +2 -2
- package/driver/profiles.mjs +55 -17
- package/driver/progress.mjs +18 -8
- package/driver/provider-usage.mjs +8 -8
- package/driver/publish/index.mjs +154 -8
- package/driver/publish/knockout.mjs +39 -5
- package/driver/publish/pool-admin.mjs +1 -1
- package/driver/publish/publish-inputs.mjs +18 -2
- package/driver/publish/render-knockout.mjs +184 -31
- package/driver/publish/render.mjs +323 -93
- package/driver/publish/report-data.mjs +4 -1
- package/driver/publish/report-topbar.mjs +58 -0
- package/driver/publish/search-depth.mjs +133 -4
- package/driver/publish/templates/report.css +78 -4
- package/driver/publish/xlsx.mjs +20 -1
- package/driver/queue-order.mjs +2 -2
- package/driver/recording-agreement.mjs +1 -1
- package/driver/reference-score.mjs +1 -1
- package/driver/register-availability.mjs +2 -2
- package/driver/register-count.mjs +50 -5
- package/driver/register-coverage.mjs +161 -1
- package/driver/register-digest-record.mjs +236 -11
- package/driver/register-grant-vocabulary.mjs +1 -1
- package/driver/register-plan.mjs +189 -2
- package/driver/registry-fidelity.mjs +3 -3
- package/driver/repair-composers.mjs +1 -1
- package/driver/repair-contract.mjs +1 -1
- package/driver/replay-archive.mjs +6 -6
- package/driver/report-overview-record.mjs +2 -2
- package/driver/result-noun-fields.mjs +2 -2
- package/driver/run-economics.mjs +41 -10
- package/driver/run-requirements.mjs +173 -9
- package/driver/runner.mjs +5 -5
- package/driver/scope-facts.mjs +20 -5
- package/driver/scope-ledger.mjs +5 -5
- package/driver/search-policy.mjs +22 -12
- package/driver/skills/README.md +15 -15
- package/driver/skills/blind-frame/SKILL.md +2 -2
- package/driver/skills/case-law-citation/SKILL.md +4 -4
- package/driver/skills/case-law-citation/sources/eurlex.md +1 -1
- package/driver/skills/{prelim-common-law → clearance-common-law}/SKILL.md +22 -22
- package/driver/skills/{prelim-common-law → clearance-common-law}/perplexity-prompts.md +1 -1
- package/driver/skills/{prelim-register → clearance-register}/SKILL.md +10 -10
- package/driver/skills/{prelim-register → clearance-register}/digest.md +2 -2
- package/driver/skills/{prelim-register → clearance-register}/providers/README.md +1 -1
- package/driver/skills/{prelim-register → clearance-register}/providers/clarivate.md +37 -35
- package/driver/skills/{prelim-register → clearance-register}/providers/corsearch.md +20 -11
- package/driver/skills/{prelim-register → clearance-register}/providers/signa.md +5 -5
- package/driver/skills/{prelim-register → clearance-register}/register-recipes.md +3 -3
- package/driver/skills/{prelim-register → clearance-register}/status-rules.md +2 -2
- package/driver/skills/{prelim-register → clearance-register}/stealth-filer-indicators.md +1 -1
- package/driver/skills/{prelim-register → clearance-register}/unit.md +2 -2
- package/driver/skills/{prelim-search → clearance-search}/SKILL.md +31 -31
- package/driver/skills/{prelim-search → clearance-search}/delivery-contract.md +1 -1
- package/driver/skills/{prelim-search → clearance-search}/phase2-execution.md +18 -18
- package/driver/skills/{prelim-search → clearance-search}/synthesis-rules.md +7 -7
- package/driver/skills/{prelim-variants → clearance-variants}/SKILL.md +18 -18
- package/driver/skills/{prelim-variants → clearance-variants}/transliteration-scripts.md +5 -5
- package/driver/skills/frame-diff/SKILL.md +1 -1
- package/driver/skills/knockout-assess/SKILL.md +10 -7
- package/driver/skills/matter-frame/SKILL.md +3 -3
- package/driver/skills/narrative-refutation/SKILL.md +9 -9
- package/driver/skills/placement-inquiry/SKILL.md +5 -5
- package/driver/stage-context.mjs +1 -1
- package/driver/stages-knockout.mjs +4 -4
- package/driver/stages.mjs +65 -61
- package/driver/status-snapshot.mjs +2 -2
- package/driver/suite-census.json +340 -136
- package/driver/surface-exit-verdict.mjs +58 -0
- package/driver/systemd/README.md +9 -6
- package/driver/systemd/clearotron-worker.service +1 -1
- package/driver/terminal-clamp.mjs +109 -1
- package/driver/tokens.mjs +169 -3
- package/driver/unit-environment.mjs +42 -15
- package/driver/unit-inventory.mjs +19 -2
- package/driver/usage-ledger.mjs +1 -1
- package/driver/variant-manifest-model.mjs +4 -4
- package/driver/verify-knockout.mjs +27 -0
- package/driver/verify.mjs +94 -6
- package/driver/whatif-queue.mjs +1 -1
- package/driver/wordlists/en.txt +63906 -0
- package/mcp-server/CHANGELOG.md +8 -0
- package/mcp-server/README.md +1 -1
- package/mcp-server/lib/README.md +1 -1
- package/mcp-server/lib/options.mjs +8 -7
- package/mcp-server/lib/plan.mjs +18 -2
- package/mcp-server/lib/runs.mjs +1 -1
- package/mcp-server/lib/usage.mjs +3 -3
- package/mcp-server/lib/whatif.mjs +1 -1
- package/mcp-server/package.json +1 -1
- package/mcp-server/server.mjs +18 -1
- package/package.json +12 -11
- package/portal-ui/dist/assets/{index-CVOIvdhc.css → index-CtvwLCti.css} +207 -3
- package/portal-ui/dist/assets/{index-5UyqAyNM.js → index-EVaSo5-g.js} +1580 -527
- package/portal-ui/dist/index.html +2 -2
- package/portal-ui/package.json +1 -1
- package/providers/README.md +1 -1
- package/providers/_shared/enumerate.mjs +6 -6
- package/providers/_shared/execute-plan.mjs +3 -3
- package/providers/_shared/ledger.mjs +119 -5
- package/providers/_shared/provider-text.mjs +2 -2
- package/providers/_shared/screen.mjs +2 -2
- package/providers/_shared/script-form.mjs +3 -3
- package/providers/_shared/territory-codes.mjs +23 -3
- package/providers/clarivate/README.md +1 -1
- package/providers/clarivate/src/capabilities.js +12 -12
- package/providers/clarivate/src/core.js +37 -43
- package/providers/corsearch/README.md +1 -1
- package/providers/corsearch/src/capabilities.js +5 -5
- package/providers/corsearch/src/core.js +3 -3
- package/providers/jx/README.md +2 -1
- package/providers/jx/src/turn-envelope.mjs +8 -3
- package/providers/oauth-mcp-bridge/CHANGELOG.md +8 -0
- package/providers/oauth-mcp-bridge/package.json +1 -1
- package/providers/perplexity/src/core.js +1 -1
- package/providers/signa/README.md +1 -1
- package/providers/signa/src/capabilities.js +42 -49
- package/providers/signa/src/core.js +106 -29
- package/providers/uspto-local/README.md +1 -1
- package/providers/uspto-local/src/sync.js +1 -1
- package/scripts/README.md +1 -0
- package/scripts/ask-ai-render-check.mjs +127 -1
- package/scripts/authority-boundary-probe.mjs +8 -6
- package/scripts/backfill-started-at.mjs +2 -2
- package/scripts/census-merge-driver.mjs +33 -2
- package/scripts/citation-anchor-report.mjs +181 -0
- package/scripts/dead-names.mjs +1 -1
- package/scripts/deprecate-below.mjs +66 -8
- package/scripts/drain-preflight.mjs +1 -1
- package/scripts/e2e.mjs +174 -0
- package/scripts/env-audit.mjs +39 -6
- package/scripts/env-classify.mjs +20 -2
- package/scripts/freeze-example-run.mjs +61 -18
- package/scripts/generated-files-are-current.mjs +69 -4
- package/scripts/live-surface-check.mjs +124 -41
- package/scripts/markdown-link-check.mjs +1 -1
- package/scripts/merge-shape-check.mjs +242 -0
- package/scripts/mint-names-in-force.mjs +5 -5
- package/scripts/mint-offered-territories.mjs +72 -0
- package/scripts/mint-public-residue.mjs +2 -2
- package/scripts/mint-reference-strip-backlog.mjs +2 -2
- package/scripts/mint-suite-census.mjs +75 -2
- package/scripts/mint-writing-standard-backlog.mjs +2 -2
- package/scripts/purge-runs.mjs +7 -7
- package/scripts/reconcile-runs.mjs +2 -2
- package/scripts/release-approve-parked.mjs +20 -2
- package/scripts/release-await-cut.mjs +120 -1
- package/scripts/release-note-required.mjs +76 -8
- package/scripts/report-header-render-check.mjs +164 -0
- package/scripts/settings-render-check.mjs +75 -2
- package/scripts/test-full.mjs +96 -3
- package/scripts/test-run.mjs +10 -0
- package/shared/brand.mjs +27 -0
- package/shared/connect-clients.mjs +39 -11
- package/shared/deployment-box.mjs +7 -2
- package/shared/driver-dir.mjs +1 -1
- package/shared/env-aliases.mjs +1 -1
- package/shared/identifier-scan.mjs +65 -9
- package/shared/identifier-sentinels.mjs +22 -0
- package/shared/names-in-force.mjs +4 -2
- package/shared/offered-territories.json +738 -0
- package/shared/pre-rename-spellings.mjs +53 -0
- package/shared/reference-guard-classes.mjs +40 -2
- package/shared/stdio-connect.mjs +39 -4
- package/shared/tree-commit.mjs +48 -0
- /package/driver/skills/{prelim-register → clearance-register}/providers/euipo.md +0 -0
- /package/driver/skills/{prelim-register → clearance-register}/providers/free-tier.md +0 -0
- /package/driver/skills/{prelim-register → clearance-register}/providers/uspto-local.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/field-doctrine-pharma.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/firm-wide-reasoning.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/report-prose.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-demo.manifest.json +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-demo.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-triage.manifest.json +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework-triage.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework.manifest.json +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/risk-framework.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/template-formatting.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/templates/email/generic.md +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/templates/search-request-form.html +0 -0
- /package/driver/skills/{prelim-search → clearance-search}/worked-examples-demo.md +0 -0
- /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 `
|
|
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 [`
|
|
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](../
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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
|
-
`../
|
|
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
|
-
`../
|
|
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
|
-
`../
|
|
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".**
|
|
126
|
-
|
|
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
|
|
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
|
|
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 `
|
|
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 `
|
|
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 `
|
|
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 (`
|
|
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/
|
|
32
|
-
- `register-findings.md` at `studio/
|
|
33
|
-
- `common-law-findings.md` at `studio/
|
|
34
|
-
- `placement-recommendations.md` at `studio/
|
|
35
|
-
- `variant-manifest.md` at `studio/
|
|
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 `
|
|
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 `
|
|
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 (`
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
package/driver/stage-context.mjs
CHANGED
|
@@ -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
|
-
"
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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.`,
|