@aeptus/aexeo-emdash 0.6.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,126 @@ 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
+
9
129
  ## [0.6.0] - 2026-05-03
10
130
 
11
131
  **Breaking change**: the `seogeo` → `aexeo` rename across the
@@ -379,7 +499,9 @@ First public release.
379
499
  `astro.config.mjs` for the WASM import to resolve to a
380
500
  precompiled `WebAssembly.Module`. Not optional.
381
501
 
382
- [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.6.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
383
505
  [0.6.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.5.0...aexeo-emdash-v0.6.0
384
506
  [0.5.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.4.0...aexeo-emdash-v0.5.0
385
507
  [0.4.0]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.3.0...aexeo-emdash-v0.4.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"}