@aeptus/aexeo-emdash 0.5.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,188 @@ and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.0] - 2026-05-03
10
+
11
+ Layer-4 entity-presence diagnostic. The `/entity-legitimacy`
12
+ admin page now queries five free public APIs against the
13
+ configured organization in the truth manifest and surfaces what
14
+ the open web actually shows.
15
+
16
+ **Compatibility:** verified against emdash `0.7.0` and `0.8.0`.
17
+
18
+ ### Added
19
+
20
+ - **Public web presence diagnostic** on `/entity-legitimacy`,
21
+ below the truth-manifest authoring section. Five sources, one
22
+ card each, one Refresh button:
23
+ - **Wikipedia** (OpenSearch)
24
+ - **Wikidata** (`wbsearchentities`)
25
+ - **GitHub** (`/users/<handle>`)
26
+ - **Domain registration** (RDAP via the `rdap.org` redirector)
27
+ - **Common Crawl** (CDX index latest available)
28
+
29
+ Each card shows one of four states: *found* (with deep-link),
30
+ *no record*, *couldn't reach* (network/timeout/rate-limit),
31
+ *skipped* (preconditions missing). No scoring — Aexeo surfaces
32
+ this layer, it does not grade it. The "Open ↗" link on each
33
+ *found* row deep-links to the source's record so editors can
34
+ verify directly.
35
+ - **`POST .../plugins/aexeo-emdash/presence`** route with `kind:
36
+ "data"` (cached read) and `kind: "refresh"` (re-query and
37
+ persist) operations. Cached for 24h in `presence:current`; the
38
+ cache is invalidated when the manifest's organization name
39
+ changes (so stale results against a different entity never show).
40
+ - **`TruthEntity` and `TruthManifest` type exports** — minimal
41
+ TS projections of the Rust truth-manifest shape, sufficient for
42
+ the fields the plugin reads on the TS side.
43
+
44
+ ### Notes on rate limits
45
+
46
+ The five APIs are all free and unauthenticated. The 24h cache
47
+ is the rate-limit backstop:
48
+ - GitHub's 60/hr unauth cap is the binding constraint and stays
49
+ comfortably under the limit even with liberal manual refreshing.
50
+ - Wikipedia, Wikidata, and Common Crawl have no published cap;
51
+ the plugin sends a polite `User-Agent` identifying itself.
52
+ - RDAP via `rdap.org` is a community redirector with no published
53
+ cap.
54
+
55
+ If a fetch times out (>5s) or returns 429/5xx, the corresponding
56
+ source card shows "couldn't reach" with the underlying error;
57
+ hitting Refresh later retries.
58
+
59
+ ### Notes for hosts upgrading from 0.7.x
60
+
61
+ - No code changes required. The configured factory is unchanged
62
+ and the new route is registered automatically.
63
+ - Editors who haven't authored a truth manifest yet will see the
64
+ "Author the truth manifest first" CTA on `/entity-legitimacy`
65
+ — this is the same page where they author the manifest, so the
66
+ CTA composes cleanly.
67
+ - The presence diagnostic doesn't run on its own. Editors must
68
+ click Refresh once after authoring (or updating) the manifest
69
+ to populate the cache.
70
+
71
+ ## [0.7.0] - 2026-05-03
72
+
73
+ Restructures the admin sidebar around the four-layer GEO model
74
+ (retrievability, citability, absorbability, entity legitimacy) from
75
+ the May 2026 research synthesis. Each pillar is its own admin page,
76
+ each finding carries its rule's layer assignment, and the
77
+ entity-legitimacy pillar folds in the truth-manifest authoring UI.
78
+
79
+ **Compatibility:** verified against emdash `0.7.0` and `0.8.0`.
80
+
81
+ ### Added
82
+
83
+ - **Four pillar admin pages**: `/retrievability`, `/citability`,
84
+ `/absorbability`, `/entity-legitimacy`. Each filters findings to
85
+ rules whose primary layer matches; cross-cutting rules surface
86
+ their secondary layers as chips on the row ("this rule also
87
+ affects citability").
88
+ - **`layerBreakdown` field** on the `FindingsPayload` wire shape.
89
+ One entry per layer with totals, errors, and warnings; primary
90
+ layer only, so the sum equals `totals.findings`. Powers the
91
+ pillar header counts and a future dashboard widget badge.
92
+ - **`layers` field on each `Finding`**, populated by the bridge
93
+ during `evaluateDocuments`. Optional in the type so legacy KV
94
+ entries written before the enrichment landed still parse —
95
+ legacy rows fall back to `citability` (the most common layer)
96
+ until the next refresh repopulates them.
97
+ - **Type exports**: `Layer`, `RuleLayers`, `LAYERS_ORDERED`,
98
+ `layerHumanLabel`, `layerOneLineDescription` from the package
99
+ root for hosts that want to reuse the framework.
100
+
101
+ ### Changed
102
+
103
+ - **`/facts` is now an alias** for `/entity-legitimacy`. The
104
+ truth-manifest authoring UI is unchanged but it lives inside the
105
+ entity-legitimacy pillar page (composed alongside FACTS00x
106
+ findings and a placeholder for the layer-4 presence diagnostic
107
+ shipping in 0.8.0). Old bookmarks to `/facts` keep working.
108
+ - **Sidebar order changed**: pillar entries first, then `/document`
109
+ (cross-layer per-document panel), then `/findings` (the existing
110
+ cross-pillar flat-view, kept for "show me everything" triage).
111
+ Editors who had the old "SEO findings / Document SEO / Truth
112
+ manifest" layout in muscle memory will need to re-orient.
113
+ - **WASM bridge enriches each finding** with its layer assignment
114
+ before returning JSON. The Rust engine is the canonical layer
115
+ authority; the plugin doesn't maintain a parallel mapping.
116
+
117
+ ### Notes for hosts upgrading from 0.6.x
118
+
119
+ - No code changes required for hosts using only `aexeoPlugin({ ... })`.
120
+ The configured factory is unchanged.
121
+ - The four pillar pages each carry their own URL path — links to
122
+ `/admin/plugins/aexeo-emdash/retrievability` etc. work
123
+ immediately after upgrade.
124
+ - Editors will see four new sidebar entries and one renamed entry
125
+ (`Truth manifest` is gone from the sidebar; its content lives at
126
+ `Entity legitimacy`). Worth a brief internal note to the
127
+ editorial team before deploying the bump.
128
+
129
+ ## [0.6.0] - 2026-05-03
130
+
131
+ **Breaking change**: the `seogeo` → `aexeo` rename across the
132
+ codebase reaches the published API. Hosts on 0.5.x using the
133
+ sandboxed factory or the env-var fallback need to update their
134
+ imports and config. The configured factory was already named
135
+ `aexeoPlugin` in 0.5.x, so consumers using only that path are
136
+ unaffected.
137
+
138
+ **Compatibility:** verified against emdash `0.7.0` and `0.8.0`.
139
+
140
+ ### Changed (breaking)
141
+
142
+ - **Sandboxed factory rename:** `seogeoPluginSandboxed(...)` is now
143
+ `aexeoPluginSandboxed(...)`. Update your import:
144
+
145
+ ```ts
146
+ // before (0.5.x)
147
+ import { seogeoPluginSandboxed } from "@aeptus/aexeo-emdash";
148
+ // after (0.6.0)
149
+ import { aexeoPluginSandboxed } from "@aeptus/aexeo-emdash";
150
+ ```
151
+
152
+ - **Sandboxed options type rename:** `SeogeoSandboxedOptions` →
153
+ `AexeoSandboxedOptions`. Same migration as above for any host
154
+ that referenced the type name explicitly.
155
+
156
+ - **Env var rename:** `SEOGEO_EVALUATOR_HOST` →
157
+ `AEXEO_EVALUATOR_HOST`. Update any CI / Cloudflare Pages build
158
+ config that sets the old name. The fallback chain is unchanged
159
+ otherwise (factory option > env var > none).
160
+
161
+ - **Plugin id rename:** the plugin's emdash id is now `aexeo-emdash`
162
+ (was `aexeo-seogeo`). This affects:
163
+ - admin URL paths: `/admin/plugins/aexeo-emdash/...` (was
164
+ `/admin/plugins/aexeo-seogeo/...`)
165
+ - any host code that referenced the plugin id explicitly (e.g.
166
+ in `usePluginPage(pluginId, ...)` or in plugin-bridge URLs)
167
+ - the React `adminEntry` URL convention is unchanged at the
168
+ HTTP route level (the React pages still mount under the new
169
+ plugin id automatically)
170
+
171
+ - **Widget id rename:** `seogeo-score` → `aexeo-score`. Hosts that
172
+ declared this widget id explicitly in their dashboard config need
173
+ to update.
174
+
175
+ ### Notes for hosts upgrading from 0.5.x
176
+
177
+ The configured factory has been `aexeoPlugin` since 0.5.0 — sites
178
+ using only `aexeoPlugin({ ... })` need no code changes for this
179
+ release. The breaking changes above only affect:
180
+
181
+ 1. Hosts using the sandboxed factory.
182
+ 2. Hosts deploying with the `SEOGEO_EVALUATOR_HOST` env var.
183
+ 3. Host-side code or workflows that hardcode the plugin id
184
+ (`aexeo-seogeo`) or widget id (`seogeo-score`).
185
+
186
+ Migration is a sed-and-rebuild for most hosts. The rename was the
187
+ last user-facing trace of the original `seogeo` codebase name —
188
+ 0.6.0 closes the renaming pass that started across the workspace
189
+ in late April.
190
+
9
191
  ## [0.5.0] - 2026-05-01
10
192
 
11
193
  Three follow-ups from real-world adoption feedback after 0.4.0:
@@ -317,7 +499,10 @@ First public release.
317
499
  `astro.config.mjs` for the WASM import to resolve to a
318
500
  precompiled `WebAssembly.Module`. Not optional.
319
501
 
320
- [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.5.0...HEAD
502
+ [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.0...HEAD
503
+ [0.8.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.7.0...aexeo-emdash-v0.8.0
504
+ [0.7.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.6.0...aexeo-emdash-v0.7.0
505
+ [0.6.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.5.0...aexeo-emdash-v0.6.0
321
506
  [0.5.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.4.0...aexeo-emdash-v0.5.0
322
507
  [0.4.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.3.0...aexeo-emdash-v0.4.0
323
508
  [0.3.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.2.0...aexeo-emdash-v0.3.0
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Absorbability(): React.JSX.Element;
3
+ //# sourceMappingURL=Absorbability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Absorbability.d.ts","sourceRoot":"","sources":["../../src/admin/Absorbability.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,wBAAgB,aAAa,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAEjD"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Citability(): React.JSX.Element;
3
+ //# sourceMappingURL=Citability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Citability.d.ts","sourceRoot":"","sources":["../../src/admin/Citability.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,wBAAgB,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAE9C"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function EntityLegitimacy(): React.JSX.Element;
3
+ //# sourceMappingURL=EntityLegitimacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityLegitimacy.d.ts","sourceRoot":"","sources":["../../src/admin/EntityLegitimacy.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,wBAAgB,gBAAgB,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CA0BpD"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function EntityPresence(): React.JSX.Element;
3
+ //# sourceMappingURL=EntityPresence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityPresence.d.ts","sourceRoot":"","sources":["../../src/admin/EntityPresence.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiD/B,wBAAgB,cAAc,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAqHlD"}
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import { type Layer } from "../types.js";
3
+ export declare function PillarView({ layer, extraSlot, }: {
4
+ layer: Layer;
5
+ extraSlot?: React.ReactNode;
6
+ }): React.JSX.Element;
7
+ //# sourceMappingURL=PillarView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PillarView.d.ts","sourceRoot":"","sources":["../../src/admin/PillarView.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,aAAa,CAAC;AAWrB,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,SAAS,GACV,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IAGb,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC7B,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CA6MpB"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ export declare function Retrievability(): React.JSX.Element;
3
+ //# sourceMappingURL=Retrievability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Retrievability.d.ts","sourceRoot":"","sources":["../../src/admin/Retrievability.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,wBAAgB,cAAc,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAElD"}
package/dist/admin.d.ts CHANGED
@@ -1,6 +1,14 @@
1
+ import { Absorbability } from "./admin/Absorbability.js";
2
+ import { Citability } from "./admin/Citability.js";
3
+ import { EntityLegitimacy } from "./admin/EntityLegitimacy.js";
1
4
  import { Facts } from "./admin/Facts.js";
2
5
  import { Findings } from "./admin/Findings.js";
6
+ import { Retrievability } from "./admin/Retrievability.js";
3
7
  export declare const pages: {
8
+ "/retrievability": typeof Retrievability;
9
+ "/citability": typeof Citability;
10
+ "/absorbability": typeof Absorbability;
11
+ "/entity-legitimacy": typeof EntityLegitimacy;
4
12
  "/findings": typeof Findings;
5
13
  "/facts": typeof Facts;
6
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,eAAO,MAAM,KAAK;;;CAMjB,CAAC"}
1
+ {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,KAAK;;;;;;;CAajB,CAAC"}