ci(release): version packages - #27
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
26 times, most recently
from
September 2, 2026 23:23
b762baf to
181c37a
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
September 2, 2026 23:44
181c37a to
b984c56
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@forkpoint/agent-lighthouse@4.0.0
Major Changes
9caf97b: Audit boundary enforcement & gatherer uniformity (Phase 4 of audit architecture migration):
ctx.fetch, barefetch(), or HTTP client imports inpackages/core/src/audits/.scripts/check-audit-boundaries.mjsand added"check:audit-boundaries"script topackage.json.gatherers/mcp.ts,gatherers/discovery.ts,gatherers/rsl.ts,gatherers/security.ts, andgatherers/author.tswith WeakMap per-scan fetch caching._mcp-client.tsout ofaudits/intogatherers/mcp.ts.scripts/lib/requires-analysis.mjswith gatherer evidence mappings.64c23e7: One URL, One Score, The Origin Cached (Phase 5 of audit architecture migration):
MAX_PAGES_PER_SCAN = 1andDEFAULT_SCAN_LIMIT = 1, removing legacy multi-page discovery heuristics and regex guessers.options.pages).OriginCachemodule (computeOriginCacheKey,shouldBypassOriginCache, TTL eviction, and credential stripping) with versioned cache keys (${origin}|${ORIGIN_EVIDENCE_VERSION}).Authorization,Cookie, or basic-auth credentials) automatically bypass the shared origin cache to guarantee secret isolation.originEvidencemetadata (origin,version,readAt,cached) intoScanReport.packages/core/src/tests/origin-idempotence.test.tsverifying all three Phase 5 gates: Idempotence across URLs, Cache Isolation & Credential Protection, and Version Invalidation.111cdbf: Page type becomes consent (Phase 3 of audit architecture migration):
ScanOptions.pageType?: PageTypeand CLI--page-typeflag.PageContext.pageTypeSource: 'declared' | 'detected'.AuditMeta.applicablePageTypestoAuditMeta.pageTypes.informativemode (unscored); only user-declared page types authorize scoring.assessedMass.page.pageTypeaccesses across all 17 audit sources.cebbba0: The Score States Its Conditions & The Warrant Expires (Phase 6 of audit architecture migration):
conditionstoScanReportandScanConditionsSchema: transparently reports the target URL, page type (declaredvsdetected), origin evidence status (cachedvsfresh, version, andreadAt), evidence coverage breakdown (registryMass,assessedMass,pageMass,originMass,gatedMass), and unscored audit breakdown.terminal,markdown,html) to display the Scan Conditions block beside and beneath the headline score.scripts/sweep-audit-reviews.mjsand scheduled GitHub workflow.github/workflows/audit-review-sweep.ymlto track evidence dossiers older than 6 months (180 days).Patch Changes
a719d16:
--page-typenow reaches the scan. The flag was parsed and then dropped beforerunScan, so every page-typed audit ran as informative and a product scan silently lost 9.8 weight of score. The value is validated against the four page types at argument parsing; an unknown value exits with the valid list, the way an unknown category does. The flag is documented in--help.88cb080: Code hygiene and linter zero-warning hardening:
.oxlintrc.jsonwith ignore pattern for.astrotemplates (which are compiled and verified byastro check).content.config.ts.pnpm lintandpnpm typecheckto 0 errors, 0 warnings, and 0 hints across the entire codebase.2cbdd13: Widen the oxlint surface from
correctnessalone tocorrectnessplussuspicious, and add theimportandpromiseplugins..oxlintrc.jsonpreviously declared nothing but an ignore pattern, so oxlintran its default set: the
correctnesscategory over the default plugins. Theconfig now names the plugin list explicitly —
eslint,typescript,unicorn,oxc,import,promise— enablessuspiciousas an errorcategory, and turns on three rules that the categories leave off:
no-return-await,unicorn/no-unnecessary-awaitandunicorn/prefer-regexp-test. Rule count rises from 96 to 113.The five findings the wider set surfaced are fixed, none of them behavioural:
agent-interfaces/openapi-servers,operability-safety/engine/domandoperability-safety/engine/tableeach imported one module twice. The secondimport in the two engine files carried a comment calling itself lazy; an ESM
import is hoisted either way, so the comment described something the module
graph never did. Merged into the single import at the top.
getGaugeColorin the HTML renderer was declared insidegenerateHtmlReportand captured nothing from it. Moved to module scope.isValidUrlin the CLI constructed aURLpurely for its throw. Theconstruction is now
void-marked so the intent reads as a parse probe.metaRefreshin the a11y engine calledString#matchon a non-global regexand used only its truthiness. Now
RegExp#test.pnpm lintstays at 0 errors and 0 warnings.promise/prefer-await-to-thenwas evaluated and left off: its 16 hits arealmost all top-level
main().catch()entry points, wherethen/catchis thecorrect shape.
import/no-cyclewas also left off; the a11y engine has 7deliberate cycles that need untangling before the rule can be an error.
Updated dependencies [2dbff0b]
Updated dependencies [67876d7]
Updated dependencies [9caf97b]
Updated dependencies [adf2bce]
Updated dependencies [5e9b931]
Updated dependencies [a719d16]
Updated dependencies [4cce959]
Updated dependencies [9c0f4b8]
Updated dependencies [8b5e768]
Updated dependencies [7dea552]
Updated dependencies [1a20739]
Updated dependencies [85e77e1]
Updated dependencies [88cb080]
Updated dependencies [dcef5af]
Updated dependencies [56ab5ea]
Updated dependencies [e86bf9a]
Updated dependencies [18c3416]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [64c23e7]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [2cbdd13]
Updated dependencies [111cdbf]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [cebbba0]
Updated dependencies [a719d16]
Updated dependencies [5f612b6]
Updated dependencies [4cce959]
@forkpoint/agent-lighthouse-core@4.0.0
Major Changes
2dbff0b: Four OpenAPI audits no longer fail a site for publishing no OpenAPI document.
What was wrong.
agent-interfaces/openapi-servers,openapi-endpoints,openapi-schemasandopenapi-operation-idsare each grade B, tierscored,weight 0.6 — 2.4 combined. All four are about a document's contents, and all
four returned
failat high or medium priority when there was no document atall. Nothing gated them:
requires: ['origin-reachable']and noapplicablePageTypes, so every site that answers a 200 and has no API — abakery, a blog, a law firm — took four high-priority failures telling it to add
a
serversarray to a spec it had never written. Measuredfailon 41 of 41corpus fixtures.
agent-interfaces/openapi-existsalready declined the identical absence, andopenapi-servers' own dossier records counter-evidence arguing that an absentserversarray is legal under OpenAPI 3.1 and resolvable against thedocument's own location. Where the dossier and the code disagree, the dossier
governs.
What changed. No document read means
notApplicable, and no weight. Two ofthe four also decline a document that declares no operations, which is the same
absence one level down —
openapi-endpointsis the audit that reports an emptydocument, and it now reports it once.
Absent means absent; broken means broken. A
pathsmember that is presentand yields nothing readable —
pathsis not an object at all, or every entryunder it is defective — is a defective document, not an absent one.
openapi-endpoints,openapi-schemasandopenapi-operation-idsfail it andname the defect in
found, where all three previously reported "0 operations".A defect counts at either level: a non-object where a Path Item Object belongs
and a non-object where an Operation Object belongs are the same error. An empty
pathsobject, nopathskey, and a path item that declares no method arelegal and declare nothing, so they still decline.
A broken entry does not erase the operations beside it. A document with
twenty readable operations and one
nullpath item is graded on its twenty:openapi-endpointscounts them,openapi-schemasmeasures coverage over them,openapi-operation-idschecks their ids. The entries that could not be read arenamed in the message and counted in
found, and they do not change the verdict.What did not change. Every verdict on a document that exists and is
defective. A missing
serversarray, entries with nourl, an unreachableserver URL, low schema coverage, an unregistrable or duplicated
operationId—all still fail or warn exactly as before. That is the finding the grade B was
earned for. A document that declares no operations is still failed, by
openapi-endpoints, which is the audit whose subject it is.Also. The seven byte-identical copies of
getOpenApiSpec, and the four ofthe
pathstraversal, collapse intopackages/core/src/gatherers/openapi.ts,which now owns the read, the traversal and the precondition.
agent-interfaces/search-endpointandoperability-safety/contact-formkeepjudging a site that publishes no document — they have other evidence — and no
verdict of theirs moved.
agent-interfaces/openapi-description-qualityalreadydeclined the absence and still does; only the wording of its decline changed,
so that it says what the rest of the family says.
The shared decline now reads "No readable OpenAPI document at /openapi.json"
rather than "No OpenAPI document is published at /openapi.json". The read also
comes back empty for a 200 whose body will not parse, and a site that publishes
a broken document has not published none.
operability-safety/contact-formandagent-interfaces/search-endpointreadthe same document without judging it, and they keep the traversal they had: a
site with a
POST /contactand one malformed sibling entry still has a contactendpoint. They do stop counting a
x-specification extension as a path item,which OpenAPI 3.1 §4.8.8 says it never was. Both are informative, so no score
moves either way.
9caf97b: Audit boundary enforcement & gatherer uniformity (Phase 4 of audit architecture migration):
ctx.fetch, barefetch(), or HTTP client imports inpackages/core/src/audits/.scripts/check-audit-boundaries.mjsand added"check:audit-boundaries"script topackage.json.gatherers/mcp.ts,gatherers/discovery.ts,gatherers/rsl.ts,gatherers/security.ts, andgatherers/author.tswith WeakMap per-scan fetch caching._mcp-client.tsout ofaudits/intogatherers/mcp.ts.scripts/lib/requires-analysis.mjswith gatherer evidence mappings.9c0f4b8: refactor(core)!: perform four-way read of sitemaps and decline on absence
An absent sitemap now returns
notApplicableforsitemap-lastmodandsitemap-absolute-urlsinstead of failing the site for an unwritten document.a719d16: An informative check reports the score it measured.
toCheckResultoverwrote it with 0, so JSON and SDK consumers saw 0 for every informative check regardless of the measurement.weightstays 0 and keeps the check out of every sum; the score in the report changes.64c23e7: One URL, One Score, The Origin Cached (Phase 5 of audit architecture migration):
MAX_PAGES_PER_SCAN = 1andDEFAULT_SCAN_LIMIT = 1, removing legacy multi-page discovery heuristics and regex guessers.options.pages).OriginCachemodule (computeOriginCacheKey,shouldBypassOriginCache, TTL eviction, and credential stripping) with versioned cache keys (${origin}|${ORIGIN_EVIDENCE_VERSION}).Authorization,Cookie, or basic-auth credentials) automatically bypass the shared origin cache to guarantee secret isolation.originEvidencemetadata (origin,version,readAt,cached) intoScanReport.packages/core/src/tests/origin-idempotence.test.tsverifying all three Phase 5 gates: Idempotence across URLs, Cache Isolation & Credential Protection, and Version Invalidation.a719d16: The overall score weights each category by the mass it assessed.
runAuditsnow setsassessedMassandregistryMasson every category it builds, socalculateOverallScoreno longer falls back to registry mass on every scan. A category that could assess little of its registry moves the overall score by what it assessed, asconditions.coveragealready reported. Overall scores change on any site where a category's assessed mass differs from its registry mass, which is most sites.111cdbf: Page type becomes consent (Phase 3 of audit architecture migration):
ScanOptions.pageType?: PageTypeand CLI--page-typeflag.PageContext.pageTypeSource: 'declared' | 'detected'.AuditMeta.applicablePageTypestoAuditMeta.pageTypes.informativemode (unscored); only user-declared page types authorize scoring.assessedMass.page.pageTypeaccesses across all 17 audit sources.cebbba0: The Score States Its Conditions & The Warrant Expires (Phase 6 of audit architecture migration):
conditionstoScanReportandScanConditionsSchema: transparently reports the target URL, page type (declaredvsdetected), origin evidence status (cachedvsfresh, version, andreadAt), evidence coverage breakdown (registryMass,assessedMass,pageMass,originMass,gatedMass), and unscored audit breakdown.terminal,markdown,html) to display the Scan Conditions block beside and beneath the headline score.scripts/sweep-audit-reviews.mjsand scheduled GitHub workflow.github/workflows/audit-review-sweep.ymlto track evidence dossiers older than 6 months (180 days).a719d16: The sitemap walk reads every sitemap robots.txt declares, and a broken sitemap is reported as broken.
Sitemap:line in robots.txt is read. The walk used to stop at the first file that parsed, so a site declaring three sitemaps was judged on one. The conventional paths (/sitemap.xml,/sitemap-index.xml,/sitemap_index.xml) are probed only when no declared sitemap answers, and the first that does is taken.readSitemapfollows the walk, not the first root file. A site whose only sitemap is a broken/sitemap-index.xml, or a broken file declared in robots.txt, now readsmalformedinstead ofabsent.sitemap-exists,sitemap-lastmodandsitemap-absolute-urlschange verdict on such a site.foo.github.ioreads children onfoo.github.ioand its subdomains only, never ongithub.io.SitemapTreegainsreadableFilesandmalformedFiles;collectSitemapEntriesgainsopts.fallbackRoots.5f612b6: A scan that could not read the site now runs no audit at all.
The rule previously depended on separate mechanisms. The
requiresgateskipped 211 of 215 audits. The other four declared no requirements and checked
the unread state inside
audit(). In total, 42 audit files carried a local copyof that check, while 142 of 215 audits had no test that would catch a missing
declaration.
planAuditsnow applies the check once, above every audit's ownrequires, andunreachable-contract.test.tsholds the whole registry to it with no exemptionlist. The 42 copies are gone.
What changes for a
runScancaller: every audit on an unread scan now carriesthe runner's
nastub. This replaces more than the four localnaexplanations. It also suppresses direct-audit WAF failures, cross-origin
redirect failures, and plain-HTTP failures because none may verdict when the
scan read no attributable site response. These changes affect the findings and
any score derived from them. Each stub names the scan reason, for example
Not assessed: The homepage could not be fetched: ENOTFOUND.What changes for an SDK caller: the
requiresgate inplanAuditsis now on bydefault.
PlanOptions.enforceEvidencepreviously defaulted tofalse, soplanAudits(ctx, config)ran audits without checking their declared evidence.Pass
{ enforceEvidence: false }as the third argument to bypass only thoserequireschecks.runAuditshas noPlanOptionsargument. A caller that needsthat diagnostic mode first builds a plan with
planAudits, then passes theprecomputed plan as the fourth
runAuditsargument. Without a plan,runAuditsuses the default gated plan.
runScan'senforceEvidenceGateoption stays available as the explicitdiagnostic opt-out for
requires, and it already defaulted totrue. Passingfalsenever bypasses the unread-scan precondition. The only full bypass ofevery gate is a test-only helper that is not exported from the package.
Minor Changes
67876d7: Hardened CSS selector escaping in parser and operability audits, eliminated false positives/negatives in WAF bot wall detector, and added true offline safety for corpus tests:
escapeAttrValueto prevent Cheerio syntax crashes when HTML attributes (such as form element IDs,aria-controls,aria-describedby, andaria-labelledby) contain quotes or backslashes.attack-challenge-modeprose from falsely tripping Kasada, prevented normal PerimeterX telemetry scripts on 200 OK pages from falsely tripping PerimeterX blocks, and added Akamai HTTP 200 soft-block detection for reference-numbered error pages.vercel-com-wall-200(page),walmart-com-wall-200(page), andtirerack-com-soft-block-200(wall).AL_SKIP_NETWORK=1.docs/architecture/debt.md.1a20739: Scoped all root-file audits to require
unblocked-fetches:ORIGIN_ONLY_REQUIRESinscripts/lib/requires-analysis.mjsto requireunblocked-fetches, removing the blanket category drop inaccess-crawl-control.access-crawl-control,agent-interfaces,machine-discovery, andoperability-safetyto declareunblocked-fetches.notApplicablerather than emitting false failure or warning verdicts.dossier-public.test.tsfor Prettier formatting resilience.18c3416: Hardened script typechecking, bot wall evidence gating, and API deprecation:
tsconfig.scripts.jsonand integrated script typechecking into rootpnpm typecheck.access-crawl-control/sensitive-pathsandaccess-crawl-control/rsl-licensing-terms-conformanceto requireunblocked-fetches, preventing false scoredfailverdicts when a scan is blocked by a bot wall.MAX_CONCURRENT_REQUESTSinconstants.tsas@deprecated.Patch Changes
adf2bce: Consolidate legacy v1 audit map into canonical
docs/evidence/audit-map.json, add automated rebuild and verification script (pnpm check:audit-map), and enrichmigration-map.jsonnotes.5e9b931: Follow redirects in
machine-discovery/no-broken-linksso HTTP 3xx responses are not treated as broken, and guarddisplayValueandexplanationagainst schema overflow inAudit.toCheckResult.a719d16:
conditions.pageTypedescribes the target URL. When the target did not answer 200 and a page override did, the first surviving page was the override and the conditions block described it under the target's URL. The page type now comes from the target's own entry, or from the explicit fallback when the target was not read.4cce959: A failed fetch logs one warning line instead of the error object with its stack. The object is still there at
LOG_LEVEL=debug. A scan of a walled site no longer prints a screen of frames per request.8b5e768: Hardened corpus nightly scan workflow and site-list runner:
--allow-partialflag toscripts/scan-site-list.tsand enabled it in.github/workflows/corpus-nightly.yml, separating timeout capacity from invariant violations so partial runs complete with code 0 and preserve their uploaded summaries.7dea552: Added
text-bearing-wallto hostile-state contract suite:NOTHING_OBTAINEDwith a text-bearing HTTP 200 bot wall containing full site template navigation and branding (>50 words, >200 characters).planAuditsproperly enforces the evidence gate across all 215 audits when faced with a text-rich interstitial bot wall, guaranteeingnotApplicableverdicts rather than false findings.85e77e1: Moved corpus analysis script from test suite to
scripts/analyze-corpus.ts:packages/core/src/tests/analyze-corpus.test.tstoscripts/analyze-corpus.ts.ENOENTfailure caused by the test attempting to write an analysis report to a local workstation artifact path.pnpm exec tsx scripts/analyze-corpus.ts.88cb080: Code hygiene and linter zero-warning hardening:
.oxlintrc.jsonwith ignore pattern for.astrotemplates (which are compiled and verified byastro check).content.config.ts.pnpm lintandpnpm typecheckto 0 errors, 0 warnings, and 0 hints across the entire codebase.dcef5af: Resolve architecture debt item 1: accessibility audits on real-page corpus:
packages/core/src/tests/a11y-corpus.test.ts.A11yBackedAudits over representative real-world HTML documents across public sector, public health, forum, storefront, and SPA shell pages in ~3.2 s.real-page-corpus.test.ts.docs/architecture/debt.mdclosing debt item 1.56ab5ea: Refactor audit source extraction to eliminate code duplication across contract tests and CI scripts:
auditSourceFilesanddeclaredIdshelpers frompackages/core/src/tests/audit-sources.ts.scripts/lib/requires-analysis.mjsandscripts/check-requires.mjsto fully-typed TypeScript (.ts) consumingaudit-sources.ts.docs/architecture/debt.mdclosing the audit-sources reflection debt item.e86bf9a: Add corpus evidence gate test suite (
packages/core/src/tests/corpus-evidence-gate.test.ts):buildScanEvidence()andplanAudits()over all 41 real-page fixtures in the corpus.rendered-bodyand skip text-reading audits.docs/architecture/debt.md.a719d16: Audits no longer throw on a page whose JSON-LD carries an object-valued
@context({ "@vocab": "https://schema.org/" }). The deep node walk inherited that object into every child, then walked into it and stamped it with itself, recursing until the stack ran out. Two audits reported[scanner] Audit erroron zapier.com instead of a result. The walk now treats@contextas a vocabulary, not a node.a719d16: The live site corpus is curated.
sites.jsonshrinks from 1913 blind entries to 414 categorised domains across 13 categories plus an unknown slice, with a smoke tier of two per category. A newstatus.jsonrecords what each domain did last time, and both live runners skip dead and robots-blocked domains by default.pnpm corpus:status,pnpm corpus:probeandpnpm build:sitesmaintain it. Scan output is unchanged; only test data and scripts move.a719d16: The origin cache is bounded and keyed by request headers. It sweeps expired entries on every write and drops the oldest when it holds more than
DEFAULT_ORIGIN_CACHE_MAX_ENTRIESorigins, so a long-lived process cannot grow it without limit.computeOriginCacheKeyfolds non-credential request headers into the key, so a scan with a bot user agent never reads what a default scan wrote. Credential headers still bypass the cache and never enter a key.a719d16: Origin evidence is delivered and cached in one order. The origin homepage a non-homepage scan fetched never reached the audits, and a homepage scan wrote
undefinedinto the origin cache before repairing it, so whether a later scan of the origin saw a homepage depended on which URL was scanned first. The cache is now written after the page fetch, andCheckContext.originEvidencecarries the origin, version, read time, cache status and homepage.2cbdd13: Widen the oxlint surface from
correctnessalone tocorrectnessplussuspicious, and add theimportandpromiseplugins..oxlintrc.jsonpreviously declared nothing but an ignore pattern, so oxlintran its default set: the
correctnesscategory over the default plugins. Theconfig now names the plugin list explicitly —
eslint,typescript,unicorn,oxc,import,promise— enablessuspiciousas an errorcategory, and turns on three rules that the categories leave off:
no-return-await,unicorn/no-unnecessary-awaitandunicorn/prefer-regexp-test. Rule count rises from 96 to 113.The five findings the wider set surfaced are fixed, none of them behavioural:
agent-interfaces/openapi-servers,operability-safety/engine/domandoperability-safety/engine/tableeach imported one module twice. The secondimport in the two engine files carried a comment calling itself lazy; an ESM
import is hoisted either way, so the comment described something the module
graph never did. Merged into the single import at the top.
getGaugeColorin the HTML renderer was declared insidegenerateHtmlReportand captured nothing from it. Moved to module scope.isValidUrlin the CLI constructed aURLpurely for its throw. Theconstruction is now
void-marked so the intent reads as a parse probe.metaRefreshin the a11y engine calledString#matchon a non-global regexand used only its truthiness. Now
RegExp#test.pnpm lintstays at 0 errors and 0 warnings.promise/prefer-await-to-thenwas evaluated and left off: its 16 hits arealmost all top-level
main().catch()entry points, wherethen/catchis thecorrect shape.
import/no-cyclewas also left off; the a11y engine has 7deliberate cycles that need untangling before the rule can be an error.
a719d16: Request header layers merge by case-insensitive name. A caller's
user-agentorauthorizationin another casing was sent beside the scanner's own header as one joined value; it is now replaced.mergeHeadersandsetHeaderare exported from the fetcher.a719d16: Gatherer caches survive audit scoping. The runner hands every audit a scoped copy of the scan context, and the sixteen per-scan gatherer caches were keyed on that copy, so each audit missed the cache and repeated its fetch: three quarters of a scan's audit-time requests were duplicates. The copy now carries a
cacheOwnerstamp pointing at the scan's context, and every gatherer keys on it. One scan, one walk of the sitemap tree, one probe per feed.4cce959: An unscored scan's reason names each cause once. Two evidence keys carried the same sentence when nothing was fetched, and the report read "The scan fetched no pages. The scan fetched no pages." on every walled site.
@forkpoint/agent-lighthouse-report@4.0.0
Major Changes
cebbba0: The Score States Its Conditions & The Warrant Expires (Phase 6 of audit architecture migration):
conditionstoScanReportandScanConditionsSchema: transparently reports the target URL, page type (declaredvsdetected), origin evidence status (cachedvsfresh, version, andreadAt), evidence coverage breakdown (registryMass,assessedMass,pageMass,originMass,gatedMass), and unscored audit breakdown.terminal,markdown,html) to display the Scan Conditions block beside and beneath the headline score.scripts/sweep-audit-reviews.mjsand scheduled GitHub workflow.github/workflows/audit-review-sweep.ymlto track evidence dossiers older than 6 months (180 days).Patch Changes
2cbdd13: Widen the oxlint surface from
correctnessalone tocorrectnessplussuspicious, and add theimportandpromiseplugins..oxlintrc.jsonpreviously declared nothing but an ignore pattern, so oxlintran its default set: the
correctnesscategory over the default plugins. Theconfig now names the plugin list explicitly —
eslint,typescript,unicorn,oxc,import,promise— enablessuspiciousas an errorcategory, and turns on three rules that the categories leave off:
no-return-await,unicorn/no-unnecessary-awaitandunicorn/prefer-regexp-test. Rule count rises from 96 to 113.The five findings the wider set surfaced are fixed, none of them behavioural:
agent-interfaces/openapi-servers,operability-safety/engine/domandoperability-safety/engine/tableeach imported one module twice. The secondimport in the two engine files carried a comment calling itself lazy; an ESM
import is hoisted either way, so the comment described something the module
graph never did. Merged into the single import at the top.
getGaugeColorin the HTML renderer was declared insidegenerateHtmlReportand captured nothing from it. Moved to module scope.isValidUrlin the CLI constructed aURLpurely for its throw. Theconstruction is now
void-marked so the intent reads as a parse probe.metaRefreshin the a11y engine calledString#matchon a non-global regexand used only its truthiness. Now
RegExp#test.pnpm lintstays at 0 errors and 0 warnings.promise/prefer-await-to-thenwas evaluated and left off: its 16 hits arealmost all top-level
main().catch()entry points, wherethen/catchis thecorrect shape.
import/no-cyclewas also left off; the a11y engine has 7deliberate cycles that need untangling before the rule can be an error.
Updated dependencies [2dbff0b]
Updated dependencies [67876d7]
Updated dependencies [9caf97b]
Updated dependencies [adf2bce]
Updated dependencies [5e9b931]
Updated dependencies [a719d16]
Updated dependencies [4cce959]
Updated dependencies [9c0f4b8]
Updated dependencies [8b5e768]
Updated dependencies [7dea552]
Updated dependencies [1a20739]
Updated dependencies [85e77e1]
Updated dependencies [88cb080]
Updated dependencies [dcef5af]
Updated dependencies [56ab5ea]
Updated dependencies [e86bf9a]
Updated dependencies [18c3416]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [64c23e7]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [2cbdd13]
Updated dependencies [111cdbf]
Updated dependencies [a719d16]
Updated dependencies [a719d16]
Updated dependencies [cebbba0]
Updated dependencies [a719d16]
Updated dependencies [5f612b6]
Updated dependencies [4cce959]
@forkpoint/agent-lighthouse-mcp@4.0.0
Patch Changes
@forkpoint/agent-lighthouse-website@0.0.4
Patch Changes