clearotron 0.3.2-beta.1 → 0.3.2-beta.3

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 (53) hide show
  1. package/.env.example +29 -0
  2. package/INSTALL.md +2 -0
  3. package/README.md +15 -10
  4. package/bin/onboard.mjs +4 -4
  5. package/build-info.json +2 -2
  6. package/docs/CLIENT-MCP.md +54 -54
  7. package/docs/DELIVERY.md +16 -15
  8. package/docs/E2E.md +8 -8
  9. package/docs/GLOSSARY.md +2 -2
  10. package/docs/INTAKE.md +11 -11
  11. package/docs/ONBOARDING.md +17 -16
  12. package/docs/PORTAL.md +18 -16
  13. package/docs/README.md +10 -10
  14. package/docs/SECURITY.md +20 -20
  15. package/docs/architecture/01-product-overview.md +17 -16
  16. package/docs/architecture/02-architecture.md +6 -6
  17. package/docs/architecture/03-run-lifecycle.md +7 -7
  18. package/docs/architecture/04-configuration-reference.md +15 -13
  19. package/docs/architecture/05-config-governance.md +39 -30
  20. package/docs/architecture/05-customer-profiles.md +35 -35
  21. package/docs/architecture/06-operations-runbook.md +20 -20
  22. package/docs/architecture/07-quality-and-audit.md +17 -17
  23. package/docs/architecture/08-development-guide.md +3 -3
  24. package/docs/architecture/09-security-and-data.md +27 -27
  25. package/docs/architecture/README.md +1 -1
  26. package/docs/branding.md +8 -3
  27. package/docs/configuration.md +18 -18
  28. package/docs/writing-standard.md +3 -3
  29. package/driver/CHANGELOG.md +33 -0
  30. package/driver/driver.config.mjs +19 -3
  31. package/driver/package.json +1 -1
  32. package/driver/portal-service.mjs +34 -4
  33. package/driver/suite-census.json +118 -46
  34. package/mcp-server/CHANGELOG.md +8 -0
  35. package/mcp-server/package.json +1 -1
  36. package/mcp-server/packs/client/CONNECT.md +6 -6
  37. package/package.json +1 -1
  38. package/portal-ui/dist/assets/{index-BsbasHjM.js → index-Bki5jT_N.js} +3376 -2971
  39. package/portal-ui/dist/assets/{index-DNQpLYZF.css → index-De2RFLbT.css} +972 -205
  40. package/portal-ui/dist/index.html +2 -2
  41. package/portal-ui/package.json +1 -1
  42. package/providers/oauth-mcp-bridge/CHANGELOG.md +8 -0
  43. package/providers/oauth-mcp-bridge/package.json +1 -1
  44. package/providers/signa/src/core.js +29 -1
  45. package/scripts/ask-ai-render-check.mjs +287 -105
  46. package/scripts/release-note-required.mjs +16 -2
  47. package/scripts/release-pre-gate.mjs +111 -0
  48. package/scripts/settings-render-check.mjs +575 -0
  49. package/shared/brand.mjs +29 -0
  50. package/shared/connect-clients.mjs +99 -47
  51. package/shared/names-in-force.mjs +1 -0
  52. package/shared/stdio-connect.mjs +16 -2
  53. package/shared/writing-standard-classes.mjs +34 -3
@@ -49,8 +49,8 @@
49
49
  -->
50
50
  <link rel="preconnect" href="https://api.fontshare.com" crossorigin />
51
51
  <link href="https://api.fontshare.com/v2/css?f[]=satoshi@400,500,700,900&display=swap" rel="stylesheet" />
52
- <script type="module" crossorigin src="/portal/assets/index-BsbasHjM.js"></script>
53
- <link rel="stylesheet" crossorigin href="/portal/assets/index-DNQpLYZF.css">
52
+ <script type="module" crossorigin src="/portal/assets/index-Bki5jT_N.js"></script>
53
+ <link rel="stylesheet" crossorigin href="/portal/assets/index-De2RFLbT.css">
54
54
  </head>
55
55
  <body>
56
56
  <div id="root"></div>
@@ -2,7 +2,7 @@
2
2
  "name": "portal-ui",
3
3
  "private": true,
4
4
  "type": "module",
5
- "version": "0.3.2-beta.1",
5
+ "version": "0.3.2-beta.3",
6
6
  "license": "AGPL-3.0-only",
7
7
  "description": "The unified trademark portal UI. One address, one login: who you are decides what you see. Built as a static bundle, served by driver/portal-service.mjs — the browser never reaches profile-service or recipe-service.",
8
8
  "engines": {
@@ -1,5 +1,13 @@
1
1
  # trademark-oauth-mcp-bridge
2
2
 
3
+ ## 0.3.2-beta.3
4
+
5
+ No changes in this release.
6
+
7
+ ## 0.3.2-beta.2
8
+
9
+ No changes in this release.
10
+
3
11
  ## 0.3.2-beta.1
4
12
 
5
13
  No changes in this release.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trademark-oauth-mcp-bridge",
3
- "version": "0.3.2-beta.1",
3
+ "version": "0.3.2-beta.3",
4
4
  "license": "AGPL-3.0-only",
5
5
  "private": true,
6
6
  "description": "OAuth 2.1 MCP stdio bridge used by the engine's case-law gather stage (courtlistener / legaldatahunter).",
@@ -576,7 +576,35 @@ export function toSignaParams(p = {}) {
576
576
  const mode = String(p.match_mode ?? "").trim();
577
577
  if (mode === "exact" || mode === "phonetic" || mode === "prefix") out.strategies = [mode];
578
578
  else if (mode === "starts_with" || mode === "ends_with" || mode === "contains") out.match = mode;
579
- else if (!mode && !p.match && !(Array.isArray(p.strategies) && p.strategies.length)) {
579
+ // ── `default` IS THE COUNT LANE'S WORD FOR THE SAME UNANCHORED QUERY THE PLAN LANE CALLS `{}` ────
580
+ //
581
+ // THE DEFECT. The count lane hands `match_mode: "default"` straight through — that is the word
582
+ // `COUNT_PREDICATES` gives the CONTAINING predicate, the one whose figure a client reads under
583
+ // "Filings containing the name". `default` matched none of the branches here, so neither request
584
+ // shape was selected, and `buildSearchRequest`'s else branch sent `strategies: ["exact"]`. The
585
+ // containing column therefore printed an exact count, on the axis that most signals how crowded a
586
+ // field is, and a client was told the field was less busy than it is in a number the report states
587
+ // as fact. Nothing failed and nothing was logged: a narrower query answers perfectly well, it just
588
+ // answers a different question.
589
+ //
590
+ // The branch below already does exactly this for the plan lane, which reaches here with NO mode at
591
+ // all. The two lanes mean the same thing by different words; they now take the same shape.
592
+ else if (mode === "default") {
593
+ if (typeof out.query === "string" && !out.query.includes("*")) out.match = "contains";
594
+ }
595
+ // ── AN UNRECOGNISED MODE REFUSES; IT DOES NOT QUIETLY BECOME A NARROWER SEARCH ──────────────────
596
+ //
597
+ // THE CLASS, and it has now bitten twice. This function's own header records `starts_with` falling
598
+ // through to a plain exact search — "a NARROWER query than the plan asked for, answering as though it
599
+ // were the one requested" — and `default` has just done the same on a client-facing figure. Both were
600
+ // fixed by adding the missing word. Adding words one defect at a time leaves the next unmapped mode
601
+ // to do it a third time, silently, in whichever direction happens to be wrong.
602
+ //
603
+ // So a mode this provider cannot express is now NAMED rather than approximated. The caller turns it
604
+ // into a refused cell, and a refused cell is a disclosed gap a reader can see; a wrong number is not
605
+ // visible at all. This can only fire where a number would otherwise have been silently wrong.
606
+ else if (mode) out.unsupported_match_mode = mode;
607
+ if (!mode && !p.match && !(Array.isArray(p.strategies) && p.strategies.length)) {
580
608
  // ── THE `default` PREDICATE, WHICH JUST MADE EXECUTABLE ────────────────────────────────
581
609
  // `planPredicateParams` returns {} for the plan's `default` predicate — no match_mode at all —
582
610
  // and this branch is the only thing standing between that and `strategies: ["exact"]`. With