@aeptus/aexeo-emdash 0.8.3 → 0.8.7

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,220 @@ and the project follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.8.7] - 2026-05-04
10
+
11
+ Picks up upstream aexeo-core 0.0.13 — three quality fixes from
12
+ Aeptus's post-0.0.12 rollout feedback. All affect `intelligence
13
+ facts generate` output and `intelligence presence` Wikidata
14
+ disambiguation; no plugin-side UI change.
15
+
16
+ ### Changed (engine via bridge)
17
+
18
+ - **Product name inference is now schema-first.** When no JSON-LD
19
+ `SoftwareApplication` or `Product` block declares a name, the
20
+ generator falls back to the organization name rather than
21
+ inferring from title-segment frequency. The old algorithm
22
+ picked the most-frequent title segment across content pages,
23
+ which on Aeptus produced `products[0].name = "ISO 27001"`
24
+ (the compliance keyword that appeared in many content-page
25
+ titles). Generators that do declare typed products keep
26
+ picking the typed name.
27
+ - **Wikidata disambiguation uses positive scoring.** Candidates
28
+ whose description mentions company/organization/software-like
29
+ terms score positively; binomial-nomenclature labels
30
+ ("Aeptus singularis" — Q119813945, the species record Aeptus
31
+ reported as a false-match) and taxonomic descriptions score
32
+ negatively. When no candidate scores positively, the result is
33
+ `not_found` rather than a confidently-wrong match. Aeptus
34
+ reported the species match was still slipping through after
35
+ the 0.0.10 disambiguation fix because the description didn't
36
+ start with the canonical "species of" prefix.
37
+ - **Descriptor scoring threshold raised from `> 0` to `>= 2`.**
38
+ The 2-word bonus alone is no longer enough to qualify a
39
+ bigram as a descriptor; a phrase needs at least one anchor
40
+ word (+3) or core descriptor word (+2) to be emitted. Drops
41
+ the bigram-fragment class Aeptus reported: `"behind long"`,
42
+ `"engineer small"`, `"cycles heavy"`, `"bloated pricing"`,
43
+ `"heavy deployments"`, `"autonomous engineer"`.
44
+
45
+ ### Added
46
+
47
+ - **Per-field low-confidence warnings on generated manifests.**
48
+ `TruthManifestGeneration.warnings` now includes:
49
+ - An explicit "organization name fallback" note when
50
+ `products[0].name` was set conservatively because no
51
+ schema-typed Product was found.
52
+ - A "descriptors are heuristic-quality" note when the
53
+ organization has any descriptors at all, so downstream
54
+ consumers know not to take them at face value for identity
55
+ matching.
56
+ These reach the CLI via `intelligence facts generate`'s
57
+ warnings section and the JSON output's `warnings` array.
58
+
59
+ ### Notes for hosts upgrading from 0.8.6
60
+
61
+ - No code changes required; engine-side improvements only.
62
+ - Re-run `intelligence facts generate` to regenerate manifests
63
+ with the cleaner output. Sites that had a generated
64
+ `products[0].name` of an unrelated keyword (compliance
65
+ standard, technology, blog topic) will now get the org name
66
+ with a conservative-fallback warning.
67
+ - Re-run `intelligence presence` to get the cleaner Wikidata
68
+ disambiguation. False-positive matches against species /
69
+ taxonomic / geographic Wikidata records should drop.
70
+
71
+ ## [0.8.6] - 2026-05-04
72
+
73
+ Code-review follow-ups on the 0.8.5 agent-readiness rule bundles.
74
+ All five issues are real correctness fixes; no behavior change
75
+ for sites that already had clean output.
76
+
77
+ ### Fixed (engine via bridge)
78
+
79
+ - **Public API exposure.** `SiteCapabilities`, `infer_site_capabilities`,
80
+ `well_known_path_exists`, `run_well_known_rules`, and
81
+ `run_header_rules` are now re-exported at the `aexeo-core` root
82
+ to match the existing pattern (`run_robots_rules`,
83
+ `run_surface_rules`, etc.). Previously consumers had to use the
84
+ long `aexeo_core::well_known_rules::run_well_known_rules` form.
85
+ - **LNK020 group/check-key mismatch.** The rule was registered under
86
+ the `links` group but gated on the `headers` config key in
87
+ `static_check.rs`; toggling `links: false` would not silence it
88
+ and toggling `headers: false` would silence an unrelated group.
89
+ Fixed by moving LNK020 to a new `headers` rule group so the
90
+ registry name matches the toggle key.
91
+ - **`route_looks_api` over-match.** Bare `v1/`, `v2/`, and
92
+ `graphql` prefixes incorrectly classified docs routes
93
+ (`/v1/getting-started`, `/v2/migration-guide`, `/graphql-101`)
94
+ as API surfaces, triggering SRF020 false-positives on
95
+ content-only docs sites. Tightened to require `api/` or
96
+ `graphql/` (with the slash) — the conditional-firing design's
97
+ whole point is to keep these silent on content sites.
98
+ - **`render_robots_txt` round-trip.** Aexeo's own generator emitted
99
+ a robots.txt that tripped ROB010 + ROB011 (no AI-bot block, no
100
+ Content-Signal). Generator now emits explicit AI-bot blocks
101
+ (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot) and
102
+ a permissive Content-Signal default so Aexeo's own output
103
+ passes Aexeo's own rules.
104
+ - **SRF010/SRF015 unreachable from path-only signals.** The
105
+ capability gate required the canonical card/index file to
106
+ exist, but the rule fires when that exact file is missing —
107
+ structurally unreachable. Inference now also fires when the
108
+ `.well-known/mcp/` or `.well-known/agent-skills/` directory
109
+ exists without a canonical file inside (the partial-stub
110
+ pattern editors hit when starting an implementation).
111
+
112
+ ### Notes for hosts upgrading from 0.8.5
113
+
114
+ - No code changes required.
115
+ - `aexeo-cli generate robots-txt` (and the deploy generator) now
116
+ produces a robots.txt with explicit AI-bot blocks and a
117
+ Content-Signal directive. Editors who want a non-permissive
118
+ stance edit the line; the defaults match the wildcard `Allow: /`
119
+ posture so existing crawl behavior is unchanged.
120
+ - Sites that have a `.well-known/mcp/` or
121
+ `.well-known/agent-skills/` directory stub without canonical
122
+ files inside will now see SRF010 / SRF015 fire (correctly —
123
+ the directory-stub state is exactly what the rule was meant
124
+ to catch).
125
+
126
+ ## [0.8.5] - 2026-05-04
127
+
128
+ Brings in the agent-readiness audit rules from upstream
129
+ aexeo-core 0.0.11 — three bundles extracted from the Cloudflare
130
+ "Is Your Site Agent-Ready?" scan model.
131
+
132
+ ### Added (engine via bridge)
133
+
134
+ - **Bundle A — robots.txt extensions** (always-on, retrievability):
135
+ - `ROB010` — robots.txt has no AI-bot User-agent directives
136
+ (GPTBot, ClaudeBot, ChatGPT-User, PerplexityBot, …)
137
+ - `ROB011` — robots.txt has no Content-Signal directives
138
+ (`ai-train`, `search`, `ai-input`)
139
+
140
+ - **Bundle B — `.well-known/*` discovery surfaces** (conditional,
141
+ absorbability). All gated on a new `SiteCapabilities` inference
142
+ that reads route patterns, JSON-LD schema, llms.txt content,
143
+ and partial-file presence to decide whether the site claims
144
+ the underlying capability — so these rules don't fire on
145
+ content-only sites that have no business exposing the surface:
146
+ - `SRF010 / SRF011` — agent-skills index (Cloudflare RFC v0.2.0)
147
+ - `SRF015 / SRF016` — MCP server card (SEP-1649)
148
+ - `SRF020 / SRF021` — API catalog (RFC 9727 linkset+json)
149
+ - `SRF025` — OAuth/OIDC discovery (RFC 8414, OIDC Discovery 1.0)
150
+ - `SRF026` — OAuth protected-resource metadata (RFC 9728)
151
+
152
+ - **Bundle C — runtime header audits** (runtime-only, mixed):
153
+ - `LNK020` — homepage response sends no Link headers (RFC 8288).
154
+ Silent on pure static audits — fires only when `Page.response_headers`
155
+ is populated.
156
+ - `SRF030` — homepage doesn't honor `Accept: text/markdown`
157
+ content negotiation (Cloudflare Markdown for Agents). Adds
158
+ one extra HTTP probe at the end of the runtime audit.
159
+
160
+ ### Notes for hosts upgrading from 0.8.4
161
+
162
+ - No code changes required.
163
+ - Static audits will gain ROB010/011 immediately on every site;
164
+ the SRF010+ rules are silent unless the site has the
165
+ capability signal (so most content sites see no new findings).
166
+ - LNK020 + SRF030 only fire during runtime audits — static
167
+ audits don't reach that code path.
168
+ - The new `SiteCapabilities` API is exported from aexeo-core
169
+ for hosts that want to reuse the inference in their own
170
+ tooling.
171
+
172
+ ## [0.8.4] - 2026-05-04
173
+
174
+ Three follow-up quality fixes from Aeptus's post-0.8.3 rollout
175
+ report. The 0.8.3 manifest-quality and GEO009 fixes landed
176
+ correctly; this release closes the remaining edges that surfaced
177
+ once those were out the door.
178
+
179
+ ### Fixed (engine via bridge)
180
+
181
+ - **Multilingual 404 detection.** v0.0.9's blocklist was
182
+ English-only, so French, Spanish, Italian, German, Dutch, and
183
+ Portuguese 404 titles still leaked through as candidate
184
+ organization/product names. Aeptus reported a French
185
+ "Page introuvable" landing as `products[0].name`. The detector
186
+ now matches on cross-language morphological cues
187
+ (`introuvable`, `non trouv`, `no encontrad`, `não encontrad`,
188
+ `non trovat`, `nicht gefunden`, `niet gevonden`) plus the
189
+ literal numeric `404` anchor.
190
+
191
+ ### Fixed (presence diagnostic via bridge)
192
+
193
+ - **RDAP normalizes to the apex domain.** The diagnostic was
194
+ asking rdap.org about `www.aeptus.com` (whatever subdomain the
195
+ manifest's website happened to record), which returns
196
+ not_found because the registrable domain is the apex
197
+ (`aeptus.com`). The RDAP fetcher now strips a leading `www.`
198
+ before the lookup; the result text shows the original host
199
+ alongside the apex so editors can see what was actually
200
+ checked. Deeper subdomains (`blog.foo.bar`) still need
201
+ manual manifest correction — full public-suffix-list-aware
202
+ resolution is a future hardening.
203
+ - **Wikidata disambiguation.** wbsearchentities returns
204
+ label-matched candidates without distinguishing
205
+ Aeptus-the-company from Aeptus-the-genus-of-insects. The
206
+ fetcher now requests up to 10 candidates and prefers ones
207
+ whose description doesn't begin with natural-world or
208
+ geographic disambiguators (`genus of`, `species of`, `village
209
+ in`, `asteroid`, …). When every match is a generic-concept
210
+ description, the result still lands but `extra` flags
211
+ "likely disambiguation needed" so the editor sees the
212
+ problem instead of trusting the wrong record.
213
+
214
+ ### Notes for hosts upgrading from 0.8.3
215
+
216
+ - No code changes required; pure engine-side improvements.
217
+ - Worth re-running `intelligence facts generate` if your site
218
+ has any non-English 404 page that was leaking through.
219
+ - Worth re-running `intelligence presence` if you saw
220
+ Wikidata false-positives or RDAP not-found on a www-prefixed
221
+ domain.
222
+
9
223
  ## [0.8.3] - 2026-05-04
10
224
 
11
225
  Picks up the upstream aexeo-core 0.0.9 improvements that address
@@ -608,7 +822,11 @@ First public release.
608
822
  `astro.config.mjs` for the WASM import to resolve to a
609
823
  precompiled `WebAssembly.Module`. Not optional.
610
824
 
611
- [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.3...HEAD
825
+ [Unreleased]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.7...HEAD
826
+ [0.8.7]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.6...aexeo-emdash-v0.8.7
827
+ [0.8.6]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.5...aexeo-emdash-v0.8.6
828
+ [0.8.5]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.4...aexeo-emdash-v0.8.5
829
+ [0.8.4]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.3...aexeo-emdash-v0.8.4
612
830
  [0.8.3]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.2...aexeo-emdash-v0.8.3
613
831
  [0.8.2]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.1...aexeo-emdash-v0.8.2
614
832
  [0.8.1]: https://github.com/schiste/Aexeo/compare/aexeo-emdash-v0.8.0...aexeo-emdash-v0.8.1
@@ -1160,7 +1160,7 @@ function globToMatcher(pattern) {
1160
1160
  }
1161
1161
 
1162
1162
  // src/version.ts
1163
- var PACKAGE_VERSION = "0.8.3";
1163
+ var PACKAGE_VERSION = "0.8.7";
1164
1164
 
1165
1165
  // src/configured.ts
1166
1166
  import { definePlugin } from "emdash";
package/dist/index.js CHANGED
@@ -23,7 +23,7 @@ function buildAllowedHosts(evaluatorHost) {
23
23
  }
24
24
 
25
25
  // src/version.ts
26
- var PACKAGE_VERSION = "0.8.3";
26
+ var PACKAGE_VERSION = "0.8.7";
27
27
 
28
28
  // src/sandbox.ts
29
29
  function aexeoPluginSandboxed(options = {}) {
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "0.8.3";
1
+ export declare const PACKAGE_VERSION = "0.8.7";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aeptus/aexeo-emdash",
3
- "version": "0.8.3",
3
+ "version": "0.8.7",
4
4
  "description": "Aexeo SEO/GEO content evaluator as an emdash plugin",
5
5
  "license": "MIT",
6
6
  "author": "Aeptus",
Binary file