You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This issue collects advisory findings from Hive agents.
At lower ACMM levels, some agents work in advisory mode β they analyze code and post findings here but do not create issues or PRs. At higher levels, designated agents (e.g. quality) can open issues and PRs directly, while other agents remain advisory-only.
The governor posts periodic digest comments summarizing what advisory agents found.
Automated code review findings from Hive agents. Each finding includes a file reference and suggested fix. This comment is updated periodically.
Advice
Frozen for governor mode IDLE until 2026-11-07 (next review in 7 day(s)). The list of recommendations is frozen; their numbers, items and links are recomputed on every digest.
Counts quoted: governor actionable queue 1 PRs / 0 issues (what mode and cadence key on; excludes held, draft, in-review and human-gated items) β Overview chart 1 open PRs / 0 open issues (every open or held item across repo cards; the queue-health advice counts these).
Reduce the blocked PR queue β No longer applies: the signal that triggered this advice has cleared since the epoch began.
Widen HIVE_REPOS β The governor's actionable backlog is shallow in a low-pressure mode; adding repositories can feed more work to the hive. (signals: mode=IDLE, repo_count=1, governor_queue_total=1)
Findings: 10
π‘ Showing top 10 findings (by severity). 539 more exist. Set governor.advisory.show_all: true to see all.
Severity
Count
π high
10
π HIGH (10)
[advisory] main is red on the required Lint repository check: docs/community/user-groups/telecom/index.md fails npm run check:format docs/community/user-groups/telecom/index.mdquality
[broken-link] Research User Group page deep-links CNCF Slack workspace; signed-out readers hit a 403 sign-in wall docs/community/user-groups/research/index.mdquality
docs/community/user-groups/research/index.md:40 (merged 93c38f7, docs: add Research User GroupΒ #1996, 2026-10-29) links the channel as https://cloud-native.slack.com/archives/CTW1NRLBW. Verified with curl: that URL answers 302 to https://cloud-native.slack.com/?redir=... which answers 403 to an anonymous client, three times in a row. Public-sector, telecom and platform-engineering all link https://slack.cncf.io/ (the open invite page) and name the channel in text. Secondary effect: the weekly check-links workflow (.github/workflows/check-links.yml, last green run 40270211879 on 2026-10-26, before the merge) reports '1 dead link found' on this URL, so it goes red on main at its next scheduled run. Fix aligns the page with its three siblings and adds a guard in tests/community-group-coverage.test.mjs.
[content-defect] Argo is split into three options in the /architectures CNCF project filter data/architectures/catalog.jsonquality
The 'Filter by CNCF project' select on /architectures and /community/members offers one option per distinct projects string and matches on exact equality. Six of the ten catalog records use the CNCF Argo project, but they label it three ways: Argo (adobe, allianz, cern-scientific-computing), ArgoCD (sncf-onprem, swisscom-kubernetes-service) and Argo Workflows (flipkart-chaos-engineering). Each option returns only its own subset. The pages' own CNCFProjectCard tags all link these labels to https://www.cncf.io/projects/argo/, so the split is a labelling difference, not three projects. Fixed by normalising the front matter labels to Argo and gating the class with a contract test that compares labels by the cncf.io project the pages link them to.
[missing-workflow] Content-only CI path skips the document-contract suites that guard authored docs (adr-contract, root-docs-links) .github/workflows/ci.ymlquality
cncf/endusers main cbffa80. PR π fix(architectures): list ExternalDNS once in the catalog project filterΒ #1991 (e2f5f26, 2026-10-29) normalised ExternalDNS in data/architectures/catalog.json but did not regenerate the dependent artifact data/members.json, which scripts/generate-members.mjs derives from that catalog. Unit evidence: 'npm run generate:members' on main produces exactly one content change (sncf projects 'External-dns' -> 'ExternalDNS'); remaining diff is Prettier formatting. End-to-end evidence: not applicable - this is stale committed data, not an unexercised code path; the /members page renders members.json directly. User-observable: /members 'Filter by CNCF project' lists both 'ExternalDNS' (Swisscom) and 'External-dns' (SNCF); selecting ExternalDNS omits SNCF; SNCF's card contradicts /architectures/sncf-onprem. Gate gap: tests/generate-members.test.mjs tests the generator against synthetic fixtures and tests/members-data.test.mjs pins only member name ordering - nothing reconciles committed members.json against committed catalog.json, so the half-update passed every required check. Weekly refresh-members.yml (cron 47 3 * * 2) self-heals the value but is not a gate. Filed as cncf/endusers#2014 with the regeneration command and the reconciliation test; issue-only because part of the fix is regenerated data, outside the quality lane's PR scope.
[regression-risk] /resources/metrics publishes a submissions chart ending at 11 against a card of 10; no gate on committed metrics data data/metrics.jsonquality
data/metrics.json at main (generatedAt 2026-10-29T15:35:49.162Z, refreshed by chore: refresh metricsΒ #1989) predates the collector fix in fix(metrics): count only published architectures in the submissions seriesΒ #1992 (merged 17:03Z). The reference-architectures card reads 10 while series.referenceArchitectures ends at {date 2026-10, value 11}, both rendered on /resources/metrics by src/components/MetricsDashboard. scripts/validate-metrics.mjs checks series shape only (lines 130-149) and has no card/series agreement check, so the committed artifact passes the required Validate CI job while contradicting itself. Refresh metrics runs weekly (cron 17 3 * * 2), so the contradiction stands until Tuesday unless a maintainer dispatches it.
[regression-risk] Refresh metrics lane aborts on an oversized upstream member logo, freezing /events talk schedule .github/workflows/refresh-metrics.ymlquality
Run 40444958428 (2026-10-27) failed at npm run test:unit (tests/validators-smoke.test.mjs -> validate-architecture-assets: static/img/end-user-members/fe60e14655aad3a6-subaru.svg 2.21 MB > 2 MB), so no refresh PR was opened and four datasets froze at 2026-10-24. Observable: /events shows three KubeCon NA 2026 sessions in 'Regency Ballroom B-D' where Sessionize now says 'Regency Ballroom CD', plus one speaker-name correction; verified by running npm run collect:end-user-talks on main e7ac6e8 at 2026-10-29 (83 talks, none added/removed, validate:end-user-talks passes). Filed as cncf/endusers#1980; fix lives in .github/workflows/refresh-metrics.yml so it needs a human to land.
[user-observable-defect] Industry filter splits one vertical: Financial vs Financial Services hides architectures and members docs/architectures/allianz/index.mdquality
Rendered build/architectures/index.html and build/community/members/index.html both list adjacent industry options 'Financial' (Allianz Direct) and 'Financial Services' (Capital One). ArchitectureFilters.filterArchitectures matches industries with exact equality, so each option returns one architecture and hides the other. Same symptom maintainers fixed for project names in PR π fix(architectures): list ExternalDNS once in the catalog project filterΒ #1991. Fixed by normalising the Allianz front matter to 'Financial Services' and gating the catalog against word-subset industry labels.
[user-observable-defect] /resources/metrics labels a commit count as "Reference architecture submissions" scripts/collect-metrics.mjsquality
architectureTimelineData() counts commits touching content/en/architectures and publishes the cumulative total as the 'Reference architecture submissions' chart on /resources/metrics. Any edit commit (typo, image swap, rename) increments it. Live data: chart ends at 28 for 2026-07 while the 'Reference architectures' stat card on the same page reads 8. Reproduced: the committed fixture in tests/collect-metrics.test.mjs has 2 architecture directories and 3 commits, and the pinned expectation is a series reaching 3.
Closed on an agent's word or a hive heuristic (a merged PR's title matching the finding, or the issues/PRs it cites closing). The hive did not re-check the condition, so it may still hold.
Docs audit clean at 53e82aa: production pages, delta links and documented commands verified cncf/endusers@53e82aaguide β closed Oct 31 (no evidence recorded), fix not verified
Scan pass 2026-10-31 (twenty-second) on cncf/endusers main 53e82aa: 0 findings, 0 issues, 0 PRs. Main has NOT advanced since the twenty-first pass (zero commit delta), so this pass audited never-before-covered ground instead of a delta. Re-ran the moving inputs: npm audit --package-lock-only 0 high / 0 critical (28 moderate, 3 low); OSV querybatch over all 1762 locked packages returned the same 4 hits / 3 known below-threshold advisories (minimatch 3.1.5+10.2.6 GHSA-g3hv-75wg-m249, glob 13.0.6 GHSA-3g3m-2fjr-6pw4, deepmerge 4.3.1 GHSA-gcqx-w48m-w2h4) - no newly-published advisory reaches this tree. Secret scan clean. Audited and found sound, all 17 files never named in any prior sec-check bead: mutation.yml (pull_request not pull_request_target, permissions contents:read, checkout persist-credentials:false, and the --mutate list is charset-gated to [A-Za-z0-9._/-] before interpolation so a git-quoted path cannot break out); scripts/lib/asset-extensions.mjs and all 4 consumers (project-assets, enduser-collector, validate-architecture-assets, validate-enduser-members) - every call site lowercases before .has() so a .SVGZ/.HTML upper-case bypass does not exist, and tests/mirrorable-asset-extensions.test.mjs is a real contract gate over all four importers; mdast-walk.mjs, mdx-code-blocks.mjs (asks Docusaurus unwrapMdxCodeBlocks directly rather than restating its regexes, and documents that false is not a clearance); collect-enduser-members.mjs; and the shared render components OrgAvatar/MirrorSyncStatus/ProfileDialogShell (logoUrl and sourceUrl both reach React href/src, which React 19.3 blocks for javascript: per bead 239aa952, and their upstream data is host-allowlisted by the already-filed validator gates). VERIFIED the netlify.toml header-coverage claim rather than trusting its comment: the /img/* and /favicons/* blocks that drop script-src to 'none' for a directly-opened asset do cover every active-content path - find over static/ returns zero .svg outside img/ and favicons/ (only fonts/ and manifest.json), no .svg is webpack-imported from src/docs/blog so nothing is emitted under /assets/, and endusersArchitectureImages in docusaurus.config.js:143-173 copies docs/architectures//images/** to img/architectures// which is inside the /img/* match. No gap. Live finding [sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030 (document-only CI path skips 4 real-tree doc suites) re-confirmed OPEN, carries this lane's 08:06Z root-cause comment, and stays issue-only: the fix is atomic across .github/workflows/ci.yml (unpushable at contributor tier) and the guard half alone would red main. Rulings respected: fix: cross-check the lockfile against OSV in the supply-chain gateΒ #1885 OSV arm closed-unmerged, fix(ci): install unreviewed audit-fix versions with --ignore-scriptsΒ #1928 composite deferral, .npmrc min-release-age refuted. Open PRs test(catalog): report a vertical split by two labels that share no wordΒ #2032/test(catalog): read project cards written with plain string attributesΒ #2034 are quality-lane test-only and trivially disjoint. Reaped 14 superseded pass-log beads. sec-check β closed Oct 31 (no evidence recorded), fix not verified
Scan pass 2026-10-31 (twenty-third) on cncf/endusers main a4e0f1d: 0 findings, 0 issues, 0 PRs. Main advanced 4 commits since the twenty-second pass (53e82aa -> a4e0f1d), so this pass audited that delta plus the workflow-injection surface. REAPED: beads 0fd638d8-856 and d419139c-f87 are FIXED by 01ceee8 (PR ci: run every suite that reads an authored tree on the document-only pathΒ #2035, 'Fixes [sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030', mrbobbytables); issue [sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030 CLOSED COMPLETED. Verified rather than trusted: ci.yml:125-150 now runs site-config, mdx-components, mdx-paragraph-nesting, static-orphans, content-only-ci-workflow and the four events suites on the document-only path, and tests/content-only-ci-workflow.test.mjs:12-60,130-150 now FAILS CLOSED - it readdirs tests/.test.mjs, matches suites that resolve the repo root AND name docs/|blog/|adr/|a root .md, and asserts every hit is either on the focused list or in a reasoned FULL_PATH_ONLY map, plus a reverse assertion rejecting stale entries. That is the root cause named in [sec-check] Document-only CI path skips the checks binding SECURITY.md's advisory register to the audit gate's allowlistΒ #2018/[sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030, not another name added to a hardcoded subset; ran it with node_modules installed, 35/35 pass with content-only-ci-workflow + events-catalog + events-sidebar-contract, and ci.yml and FULL_PATH_ONLY agree (events-page.test.mjs on the list, not in the map). NEW SURFACE SOUND - the events catalog (feat(events): derive the events section from per-event pages (ADR 0012)Β #2037, ADR 0012), never before covered: scripts/lib/events-catalog.mjs rejects non-calendar dates via a Date round-trip (2026-02-30 fails), end<start, a year directory disagreeing with start, a missing location and a url that is not ^https?://; id/docId/route are built from a readdir entry name, which cannot hold a path separator, so no traversal; title/description/location reach React text nodes only and event.url is rendered nowhere. The gate on a NEW event page arriving by a document-only PR is the production build itself - sidebars.js:38 calls collectEvents() at config load, so an EventPageError fails the 'Build production site' step that path runs. events-catalog-plugin.mjs runs only in Node; formatDate.js and EventsIndex are pure and UTC-pinned with no sink; tests/e2e/fixtures/docs/events-catalog.mdx is registered only behind E2E_COVERAGE=1 (docusaurus.config.js:209-231) so it cannot reach the published site. WORKFLOW INJECTION SURFACE AUDITED (15 workflows + 3 composite actions), zero sinks: no pull_request_target anywhere, and no github.event.{issue,pull_request,comment,discussion,review}.{title,body,login,ref,label,name} or github.head_ref inside any run: block. audit-fix.yml is the only workflow_run lane - checks out main not the triggering ref, persist-credentials:false, downloads no artifact, gates on conclusion=='failure', and installs the unreviewed npm-audit-fix lockfile with 'npm ci --ignore-scripts' while holding contents:write+pull-requests:write. architecture-submission.yml is maintainer-label-gated and interpolates steps.import.outputs.id into a composite with: (not a shell); that id is uniqueId(slugify(orgName)), charset-gated to [a-z0-9-] at import-architecture-issue.mjs:244-256, so the GITHUB_OUTPUT write at :192 cannot inject a second output line. open-automation-pr pins peter-evans/create-pull-request by SHA. UNTRUSTED-PROSE PATH RE-VERIFIED END TO END: every issue-form answer reaches the page through renderSection() -> escapeMdx() (import-architecture-issue.mjs:311), allowlist-based over MARKDOWN_NODE_TYPES, intersecting code ranges across both candidate grammars, re-checking unwrapMdxCodeBlocks() output, falling back to escaping everything when hasActiveMdx() still fires. The one deliberately unescaped span is renderProjectsSection(), which emits expression-form attributes via jsx-attributes.mjs (name charset-gated, value JSON.stringify'd inside {}), so a project field cannot end its attribute. Probed cleanMarkdown()'s shortcode stripper as a splice primitive across two attacker-controlled project descriptions: both delimiters must sit inside JSON-serialized fields (prose cannot carry them, escapeMdx turns } into a character reference), and JSON.stringify never leaves a lone trailing backslash before an unescaped brace, so every splice rejoins inside the same string literal; worst case is an unparseable element, which fails the build and the workflow's failure comment - fails closed. Publication is additionally gated by findActiveContent() (ALLOWED_ELEMENTS/ALLOWED_COMPONENT/ALLOWED_IMPORT) via validate-architectures. MOVING INPUTS on a4e0f1d: npm audit --package-lock-only 0 high / 0 critical (28 moderate, 3 low), unchanged; OSV querybatch over all 1900 locked entries returned the same 3 distinct known below-threshold advisories (minimatch 3.1.5 and 10.2.6 GHSA-g3hv-75wg-m249, glob 13.0.6 GHSA-3g3m-2fjr-6pw4, deepmerge 4.3.1 GHSA-gcqx-w48m-w2h4) - no newly-published advisory reaches this tree; secret scan clean, the only literal match being the deliberate redaction fixture in tests/pr-queue-hygiene.test.mjs:952. NOTED NOT FILED (ADR 0008 rule 2, no user-observable change, and this class is already [sec-check] Document-only CI path skips the checks binding SECURITY.md's advisory register to the audit gate's allowlistΒ #2018/ci: run the SECURITY.md advisory register checks on the document-only pathΒ #2025/[sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030 so 'three of a class' bars a fourth): the new guard's RESOLVES_REPO_ROOT regex matches only the two literal root-resolution forms, so a future suite reaching the authored trees through a shared helper would go undetected - re-evaluate only if such a suite lands. Rulings respected: fix: cross-check the lockfile against OSV in the supply-chain gateΒ #1885 OSV arm closed-unmerged, fix(ci): install unreviewed audit-fix versions with --ignore-scriptsΒ #1928 composite deferral, .npmrc min-release-age refuted. No open hold-gated PRs in this lane. sec-check β closed Oct 31 (the issues/PRs it cites closed), fix not verified
Scan pass 2026-10-31 (twentieth) on cncf/endusers main f88e3d4: 1 MEDIUM finding filed ([sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030), 0 PRs. npm audit 0 high/0 critical; OSV querybatch over all 1762 locked packages returned only the 3 known below-threshold entries (minimatch GHSA-g3hv-75wg-m249, glob GHSA-3g3m-2fjr-6pw4, deepmerge GHSA-gcqx-w48m-w2h4) - the two HIGHs from the nineteenth pass are gone, confirming fix: raise the follow-redirects and joi override floors to clear high advisoriesΒ #2024 merged as d2df17d. Secret scan clean (only ghp_example/ghs_ test fixtures). Reviewed and found sound: new confirmInRangeFixes() in audit-gate.mjs (fails closed on every error path), architecture-submission.yml (label-gated, slug output is [a-z0-9-] so no GITHUB_OUTPUT injection, composite action passes title to a JS action not a shell), mirrorArtworkUrls/artworkPath (cncf/artwork main|master only, SHA refused, symlink and remote-reference gates), dependabot-automerge.yml (pull_request not _target, triple actor check, exact lockfile-only match). Verified [sec-check] Document-only CI path skips the checks binding SECURITY.md's advisory register to the audit gate's allowlistΒ #2018's fix genuinely closes: a fabricated SECURITY.md register row now fails tests/security-advisory-register.test.mjs on the document-only path. Secondary, NOT filed (trust model unestablished - authored content is maintainer-reviewed and CSP script-src 'self' blocks inline script): no suite on either path flags <script>, javascript: links or off-origin images in authored docs/blog. sec-check β closed Oct 31 (no evidence recorded), fix not verified
Docs audit clean at 5b83c01: production pages verified, no fileable gaps cncf/endusers@5b83c01guide β closed Oct 31 (no evidence recorded), fix not verified
β¦plus 37 more closed without a verified fix in the last 48h, collapsed so the open findings above stay readable
Analyzed at cncf/endusers@b684795cbe65 (branch main) β the latest commit when this digest was generated. File references that no longer exist at this commit are flagged as outdated. Findings marked β οΈ were computed at an older commit and have NOT been re-verified here.
The prioritized review and explicit maintainer authorization supersede stale
recommendations in the generated digest. Keep this living advisory issue open.
Resolved or deliberately closed
Finding
Authoritative disposition
No mutation harness or CI gate
Delivered by merged #1731; #1729 was explicitly closed as delivered. Competing #1733 and #1735 are closed as superseded. Do not add another harness or replace the existing npm script.
MetricsDashboard throws on invalid generatedAt
Fixed by merged #1657. The old reproduction does not describe current main.
#1612 merged; competing #1615 is closed. Do not treat the old PR failure as current work.
Member-directory card accessible-name mismatch
Fixed by merged #1635, closing #1630. This does not resolve the separate navbar-search issue.
Publish-time MDX admonition preprocessing bypass
#1741 merged after the coverage repair, closing #1740. The rewrite-aware scan and regression cases remain intact.
Browser fixture for null groups
#1742 closed as not planned under ADR 0007. Invalid build-time data is not a production user-reachable interaction state.
Correct the remaining coverage interpretation
Issue #1736 is now a bounded maintainer decision about conservative cross-chunk
region attribution. It is not completed and is not a request for more data-shape
fixtures or a 100% browser-region floor.
The initial claim that 19 of 20 regions were proven executed was superseded by
the later analysis of 11 with cross-chunk evidence and 9 unproven, followed by the
PeopleFreshness correction. "Unproven" does not mean "unexecuted." A proposed
reporter change still needs evidence that it cannot credit tree-shaken or
source-map-overlapping code. ADR 0007's 96% browser-region floor remains.
All five merge items (#1741, #1744, #1739, #1746 and #1749) landed through the
normal merge queue after required checks passed. No ruleset or check bypass was
used.
The generated digest should reconcile against these actual merged, closed, and
explicitly deferred dispositions rather than treating every retained finding or
agent "done" marker as an actionable issue.
P2 handoff: external Hive intake and reconciliation
This is an operator handoff, not a claim that Hive configuration was changed.
The repository has no Hive configuration or authorized-repository allowlist;
the orchestrator's project.repos, intake prompts and reconciliation state are
maintained externally. Please apply these requirements there.
The maintainer-approved reconciliation in #23 (comment) remains
authoritative. The generated digest still repeats superseded findings, including
"no mutation-testing gate", the merged automation-PR policy tests and the closed
null-groups browser fixture. A digest footer naming current main does not
re-verify an older reproduction.
Store a per-finding evidence revision, reproduction command and observed
result. Distinguish the digest refresh revision from the revision actually
tested. Mark stale evidence explicitly rather than relabeling it as current.
Before filing or reactivating work, reconcile referenced issues and PRs,
merged fixes, superseding comments, maintainer decisions and explicit
"not planned" dispositions. Preserve unresolved and upstream-blocked items.
Apply ADR 0006 and ADR 0007 before generating test work: no test-tree
meta-guards without maintainer authorization, no malformed-build-data
browser fixtures, and no request to raise browser-region coverage to 100%. test: cover GroupLinkStatus' absent-collection fallback in the browserΒ #1742 remains closed as not planned.
Treat NoCoverage as an accounting observation until calibrated. The
awards-validator pilot recovered substantial existing assertion signal by
propagating child coordinator data; it did not reveal 104 missing tests.
Broader harness/scope changes remain a maintainer decision on [quality] Pilot: callable-core mutation attribution for CLI validatorsΒ #1752.
Supersede stale findings in the digest's backing state. Keep an audit trail
distinguishing verified fixes, superseded duplicates, deliberate policy
closures and still-open blockers instead of repeatedly presenting all of
them as actionable defects.
Acceptance evidence for the external operator: the next digest should no longer
present merged/superseded items above as open implementation work, should retain #1433 and #1618 as external blockers, and should preserve
the bounded decisions on #1736 and #1752. Keep this
living advisory issue open.
This is a verified disposition snapshot and an external Hive operator handoff,
not a claim that the generated digest's backing state or configuration has
been changed. Keep this living issue open. The prior reconciliations remain
authoritative: #23 (comment) #23 (comment)
#1763 merged with an actual 60,000-ms subprocess deadline, three attempts and two two-second delays, not just a per-request timeout. No allowlist change.
The complete #1776 merged: local recipe, contributor explanation, required CI validator, both parity directions and retirement of the old CI exemption. The issue is closed; workflow write permission was not a blocker for this authorized repair.
Repaired #1765 merged as a37c149. Independent fixtures detect all 236 isolated supported-entry deletions, including circle. This is not a new full-module Stryker score.
Accepted via merged #1757; the stale issue body now states completed and remains closed. The scoped result was 101 killed, zero survived and zero NoCoverage, not a new full-tree baseline.
The maintainer separately approved exactly one additional callable-core
extraction under [quality] Extend the merged callable-core mutation pattern to scripts/validate-architecture-assets.mjsΒ #1759. Its implementation is published as refactor: expose the architecture-assets validator as a callable coreΒ #1787; use that PR for live check/queue/merge state. Scoped
mutation measured 304 killed / 8 individually triaged equivalent survivors /
0 NoCoverage / 97.44%. All 35 behavioral survivors from the initial campaign
were killed. This is not a broad validator rollout or
authorization for new mutation globs, workflows, thresholds or runner
bridges. The assets validator is filesystem-only; JSON input contracts
copied from the awards template do not apply.
[quality] Decision: folded MDX grammar finding after SVG acceptance repairΒ #1764 was reopened only because an unrelated MDX grammar
finding had been folded into it. Its body now distinguishes completed SVG
work from the remaining scope/validity decision. No MDX export or structural
change was implemented or approved by the SVG repair.
Retire or supersede the merged findings above in the backing state. The
digest must not continue calling them open implementation work merely
because an old reproduction or agent record remains.
Keep the existing mutation harness, accepted pilot, previously merged
MetricsDashboard repair and automation-PR policy tests recognized as
delivered. Keep the deliberately closed null-groups browser fixture closed.
Distinguish a digest refresh revision from the actual revision tested for
each finding. A footer naming current main does not re-verify old evidence.
Fix component folding by underlying cause and actual affected module, not
incidental filename mentions in a comparison table. The SVG issue mentioned
mdx-escape.mjs for comparison; that did not make it an MDX component tracker.
The resulting fold must not silently close unrelated work with a SVG PR.
Preserve intentional human/external decisions and item-specific hold
authorizations. This batch's approval is not permission to release new PR
holds, widen HIVE_REPOS or increase automation scope.
There is no Hive configuration or authorized-repository allowlist in this
repository. Apply backing-state, intake and project.repos changes in the
external orchestrator, then verify the next digest against these dispositions.
Reconciliation note: the surviving-mutant backlog that the quality agent was filing per file was cleared in bulk under #1788 (full tree 82.09% to 96.24%, run 39845001035). Per-file mutant findings opened before 2026-10-22 against src/ or scripts/lib/ are likely already resolved; please re-verify against main before re-filing.
quality lane, 2026-10-25 β two sub-remit observations, no issue and no PR
Filed here rather than as issues under ADR 0008 rule 2: neither names an effect
under rule 1, so neither is mine to open. Both are verified against main at c20e9e4; the evidence is written out so a maintainer can act on either without
re-deriving it.
1. scripts/collect-metrics.mjs builds a cncf/landscape URL that 404s
scripts/collect-metrics.mjs sets the landscape source URL to https://github.com/cncf/landscape/blob/main/landscape.yml. That repository's
default branch is master, not main:
The value is carried into data/metrics.json under sources.landscape.sourceUrl.
Why this is not a rule-1 broken link. Nothing renders it. The only reader of
a metrics sources block is src/components/MemberDirectory/DirectoryFreshness.js,
which takes metrics?.sources?.architectures from here and the landscape link
from data/members.json instead β and that one is revision-pinned
(blob/<sha>/landscape.yml, built by scripts/lib/enduser-collector.mjs) and
resolves. So this is a wrong string in a dataset, not a dead link a visitor can
click.
If a maintainer wants it corrected, the durable form is the revision-pinned one scripts/lib/enduser-collector.mjs already uses, rather than swapping main for master β a floating branch name is what went stale here. Note that data/metrics.json is occupied ground: #1879 is open against it.
2. onBrokenAnchors is the one broken-link setting with neither a declaration nor a test
docusaurus.config.js declares onBrokenLinks: 'throw' and onBrokenMarkdownLinks: 'warn', and both are pinned β tests/site-config.test.mjs for the first, tests/site-config-broken-markdown-links.test.mjs
for the second, the latter resolving the value through Docusaurus's own validateConfig rather than reading the literal. The third setting is declared
nowhere, and resolving the real config the way the build does gives the
Docusaurus 3.10.2 default:
So the anchor checker's reporting level is an upstream default, and lowering it
to 'ignore' is a one-token edit nothing in the suite would notice β the exact
hole the markdown-link test was written to close for its sibling.
Why this is not a rule-1 finding. It would catch nothing today. Scanning docs/, blog/, src/ and the root markdown for site-root links carrying a
fragment returns zero matches, so there are no broken anchors for the checker to
report at any level. A test pinning the level would move no rule-1 effect, which
puts it squarely in rule 2.
Lane state
Everything else I checked on main is green and needs nothing: check:audit
passes, validate:all passes (one pre-existing foreignObject warning on the
Swisscom SVG), test:unit:coverage:check passes at 100.00% source lines and
100.00% source regions, and all 360 distinct outbound URLs in the non-member
datasets resolve except https://www.alolitasharma.com (ECONNRESET), which #1869 is already open for.
ADR 0008 follow-up: rule 2 pull requests in the 48 hours after merge
ADR 0008 merged on 2026-10-23 (#1848). Between 2026-10-24 and 2026-10-25 the fleet opened four pull requests whose only effect is a repository metric or a new gate no rule 1 effect depends on, all now closed as not planned:
Observation (harness shape, rule 2).tests/e2e/focus-trap-trigger-unmounted.spec.js
is the suite's slowest spec and carries no test.slow(). On this host it finishes
in 33.7s, i.e. just past Playwright's 30s default, and fails as Tearing down "context" exceeded the test timeout on every attempt at the default
timeout; its sibling member-directory specs run 22β30s on the same host and pass.
The spec's own steps are not what is slow β scripted against the same build
outside the runner, goto through context close totals under 1s β so this is host
speed, not the test.
It is not failing upstream and needs no change: the last 40 ci.yml runs are
merge-queue green, and no recent run uploaded a flaky-specs.json artifact, so retries: 1 is not masking a flake either. Recording it only so the next agent
that sees this spec red on a slow host recognises it as the environment and does
not file it.
Checked and not re-filed. The label-content-name-mismatch baseline in tests/e2e/accessibility.spec.js is accurate as written: docusaurus-plugin-search-local's SearchBar.jsx renders <SearchButton> with no translations prop, so neither buttonText nor buttonAriaLabel is reachable
from docusaurus.config.js. Decided question, no new information, no issue.
Re-verified 2026-10-29 aacacc1: ADR 0008 still binding, no in-remit strategic finding. Actionable queue is empty (0 open issues); the two open PRs (#1995, #1976) are maintainer-authored, not agent work. Milestones 1-5 all show 0 open issues (fully closed). Since the prior strategist sweep (Oct 26), PR #1841 (merged, this sweep) deleted ROADMAP.md, MILESTONES.md, data/milestones.json, and the milestone-creation workflow/tests outright β a maintainer decision to retire planning-doc infrastructure, not a gap to fill. Per ADR 0008 'decided questions stay decided,' strategist should not recreate ROADMAP.md or milestone docs for this repo. gh-1841,adr-0008
Re-verified 2026-10-30 99eb7b9: no in-remit strategic finding this sweep.
ADR 0008 still binding; #1841 (merged 2026-10-23) was the maintainer's explicit
decision to delete ROADMAP.md, MILESTONES.md, data/milestones.json and
every reference to them. Per "decided questions stay decided," strategist does
not recreate planning-doc infrastructure for this repo.
All five milestones (Phase 0 through Launch) still show 0 open issues via gh api repos/cncf/endusers/milestones. The two PRs open as of the prior
sweep are resolved: #1995 merged, #1976 remains open and maintainer-authored
(not agent work). 17 commits landed on main since the last strategist sweep
(Oct 29), all routine content/metrics/CI work with no roadmap-shaped gap or
adoption blocker surfaced.
quality lane, 2026-10-30 β production sweep clean, one sub-remit observation
Swept main at 5b83c01. Filed here rather than as an issue or PR under ADR 0008:
the one thing found is a consistency gap with no reachable user-visible effect today.
What was checked (all clean)
npm run validate:all β all 13 validators pass (102 members, 155 landscape records, 83 talk links, 5 born projects, 4 theme backgrounds).
Production probe of https://endusers.cncf.io: every one of the 47 sitemap.xml URLs answers 200.
Every /img/cncf-projects/... and /img/architectures/... path referenced from docs/ and data/ resolves to a committed asset.
Every architectures[].id on a member profile (MemberProfile's /architectures/<id> links) has a page under docs/architectures/.
main workflow health: refresh-members, refresh-metrics, refresh-community-people, refresh-radar-reports, audit-schedule and check-links all green on their latest runs; no required check red on main.
Near-duplicate scan of every catalog and member filter dimension. The only hit is the Argo / ArgoCD / Argo Workflows triple in the project select, which is already covered by held PR π fix(architectures): list the Argo project once in the project filterΒ #2022 β confirmed still live in the server-rendered /architectures/ HTML.
Sub-remit observation: the tag select is the one filter comparator left unpinned
#2016 pinned English collation at the eight filter-option builders
(compareLabels, a.localeCompare(b, 'en')). The ninth list in the same
function was not changed β useArchitectureFilterOptions still sorts the tag
select with a bare tagKey(a).localeCompare(tagKey(b))
(src/components/ArchitectureFilters/index.js), which uses the runtime's
default locale rather than the pinned one.
This is not the defect #2016 fixed: tagKey lowercases, so the lowercase
block that motivated that PR cannot occur here. The only residual difference is
that the build host and the visitor's browser could collate the list
differently. Every current tag is [a-z0-9 ] after tagKey, and no locale
orders that alphabet differently from en (the usual divergences β Danish/
Norwegian aa, Swedish ΓΆ, German phonebook β need characters or digraphs no
tag has), so there is nothing a visitor can observe today. Recording it only so
the next reader of that function knows the omission was looked at rather than
missed; worth a line if a non-ASCII tag ever arrives from upstream.
[quality] Latent: /metrics numbers are formatted in the visitor's locale, not a pinned one
Advisory only β this is not observable on the production site today, so per ADR 0008
it gets this comment rather than an issue or PR. Recording it because the trigger
is a data value crossing a threshold, not a code change, so it will arrive without
anything in src/ being touched.
What
src/components/MetricsDashboard/index.js formats three user-visible numbers with
no locale argument, so Intl resolves the host default:
The page is server-rendered once at build time (Node, en-US) and hydrated in the
visitor's browser, where the host default is whatever the visitor's OS/browser is.
Why it is latent, and what makes it live
Grouping separators only appear at |value| >= 1000. Every value in data/metrics.json is currently below that:
Below 1000 every locale renders the same digits, so there is nothing to see. Once a
value reaches 1000 the two sides disagree:
en-US -> 12,345 de-DE -> 12.345 fr-FR -> 12 345
endUserMembers is the one that will get there (649 and rising). At that point a
non-en visitor gets markup that differs from the SSR HTML, which React 18 treats
as a hydration mismatch for that subtree.
Why the suites will not catch it
tests/metrics-dashboard.test.mjs:120,263,352,375 and tests/e2e/metrics-dashboard.spec.js:101,238,314 build their expected strings with
the same unpinned value.toLocaleString(), so expectation and subject move together
in any locale. A guard would have to assert the pinned output literally.
The repo already decided this question for dates
src/components/shared/formatDate.js pins 'en-US' and writes down the same
reasoning ("the site is built once (in UTC) and hydrated in the visitor's browser
... would ... mismatch the server-rendered text"), and src/components/shared/compareLabels.js:14
pins 'en' after d760cde. These three calls are the remaining unpinned sites in src/. The fix is toLocaleString('en-US') at each; whether that is worth doing
before a value crosses 1000 is the maintainers' call.
Verified at 01ceee8 (npm run test:unit:coverage:check green, src 100% lines/regions).
Activity
hivecommons-hive commentedon Aug 7, 2026
π Advisory Digest β 2026-10-31 17:10 EDT
Advice
Reduce the blocked PR queueβ No longer applies: the signal that triggered this advice has cleared since the epoch began.Findings: 10
π HIGH (10)
docs/community/user-groups/telecom/index.mdqualitydocs/community/user-groups/research/index.mdqualitydata/architectures/catalog.jsonquality.github/workflows/ci.ymlqualitydata/members.jsonqualitydata/metrics.jsonquality.github/workflows/refresh-metrics.ymlqualitydocs/architectures/allianz/index.mdqualityscripts/collect-metrics.mjsqualityβοΈ Recently Closed β Fix Not Verified (10)
run-41195313886ci-maintainer β closed Oct 31 (the issues/PRs it cites closed), fix not verifiedcncf/endusers@53e82aaguide β closed Oct 31 (no evidence recorded), fix not verifiedmrbobbytables); issue [sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030 CLOSED COMPLETED. Verified rather than trusted: ci.yml:125-150 now runs site-config, mdx-components, mdx-paragraph-nesting, static-orphans, content-only-ci-workflow and the four events suites on the document-only path, and tests/content-only-ci-workflow.test.mjs:12-60,130-150 now FAILS CLOSED - it readdirs tests/.test.mjs, matches suites that resolve the repo root AND name docs/|blog/|adr/|a root .md, and asserts every hit is either on the focused list or in a reasoned FULL_PATH_ONLY map, plus a reverse assertion rejecting stale entries. That is the root cause named in [sec-check] Document-only CI path skips the checks binding SECURITY.md's advisory register to the audit gate's allowlistΒ #2018/[sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030, not another name added to a hardcoded subset; ran it with node_modules installed, 35/35 pass with content-only-ci-workflow + events-catalog + events-sidebar-contract, and ci.yml and FULL_PATH_ONLY agree (events-page.test.mjs on the list, not in the map). NEW SURFACE SOUND - the events catalog (feat(events): derive the events section from per-event pages (ADR 0012)Β #2037, ADR 0012), never before covered: scripts/lib/events-catalog.mjs rejects non-calendar dates via a Date round-trip (2026-02-30 fails), end<start, a year directory disagreeing with start, a missing location and a url that is not ^https?://; id/docId/route are built from a readdir entry name, which cannot hold a path separator, so no traversal; title/description/location reach React text nodes only and event.url is rendered nowhere. The gate on a NEW event page arriving by a document-only PR is the production build itself - sidebars.js:38 calls collectEvents() at config load, so an EventPageError fails the 'Build production site' step that path runs. events-catalog-plugin.mjs runs only in Node; formatDate.js and EventsIndex are pure and UTC-pinned with no sink; tests/e2e/fixtures/docs/events-catalog.mdx is registered only behind E2E_COVERAGE=1 (docusaurus.config.js:209-231) so it cannot reach the published site. WORKFLOW INJECTION SURFACE AUDITED (15 workflows + 3 composite actions), zero sinks: no pull_request_target anywhere, and no github.event.{issue,pull_request,comment,discussion,review}.{title,body,login,ref,label,name} or github.head_ref inside any run: block. audit-fix.yml is the only workflow_run lane - checks out main not the triggering ref, persist-credentials:false, downloads no artifact, gates on conclusion=='failure', and installs the unreviewed npm-audit-fix lockfile with 'npm ci --ignore-scripts' while holding contents:write+pull-requests:write. architecture-submission.yml is maintainer-label-gated and interpolates steps.import.outputs.id into a composite with: (not a shell); that id is uniqueId(slugify(orgName)), charset-gated to [a-z0-9-] at import-architecture-issue.mjs:244-256, so the GITHUB_OUTPUT write at :192 cannot inject a second output line. open-automation-pr pins peter-evans/create-pull-request by SHA. UNTRUSTED-PROSE PATH RE-VERIFIED END TO END: every issue-form answer reaches the page through renderSection() -> escapeMdx() (import-architecture-issue.mjs:311), allowlist-based over MARKDOWN_NODE_TYPES, intersecting code ranges across both candidate grammars, re-checking unwrapMdxCodeBlocks() output, falling back to escaping everything when hasActiveMdx() still fires. The one deliberately unescaped span is renderProjectsSection(), which emits expression-form attributes via jsx-attributes.mjs (name charset-gated, value JSON.stringify'd inside {}), so a project field cannot end its attribute. Probed cleanMarkdown()'s shortcode stripper as a splice primitive across two attacker-controlled project descriptions: both delimiters must sit inside JSON-serialized fields (prose cannot carry them, escapeMdx turns } into a character reference), and JSON.stringify never leaves a lone trailing backslash before an unescaped brace, so every splice rejoins inside the same string literal; worst case is an unparseable element, which fails the build and the workflow's failure comment - fails closed. Publication is additionally gated by findActiveContent() (ALLOWED_ELEMENTS/ALLOWED_COMPONENT/ALLOWED_IMPORT) via validate-architectures. MOVING INPUTS on a4e0f1d: npm audit --package-lock-only 0 high / 0 critical (28 moderate, 3 low), unchanged; OSV querybatch over all 1900 locked entries returned the same 3 distinct known below-threshold advisories (minimatch 3.1.5 and 10.2.6 GHSA-g3hv-75wg-m249, glob 13.0.6 GHSA-3g3m-2fjr-6pw4, deepmerge 4.3.1 GHSA-gcqx-w48m-w2h4) - no newly-published advisory reaches this tree; secret scan clean, the only literal match being the deliberate redaction fixture in tests/pr-queue-hygiene.test.mjs:952. NOTED NOT FILED (ADR 0008 rule 2, no user-observable change, and this class is already [sec-check] Document-only CI path skips the checks binding SECURITY.md's advisory register to the audit gate's allowlistΒ #2018/ci: run the SECURITY.md advisory register checks on the document-only pathΒ #2025/[sec-check] Document-only CI path skips tests/site-config.test.mjs, the gate that keeps authored docs/ and blog/ content inside the CSPΒ #2030 so 'three of a class' bars a fourth): the new guard's RESOLVES_REPO_ROOT regex matches only the two literal root-resolution forms, so a future suite reaching the authored trees through a shared helper would go undetected - re-evaluate only if such a suite lands. Rulings respected: fix: cross-check the lockfile against OSV in the supply-chain gateΒ #1885 OSV arm closed-unmerged, fix(ci): install unreviewed audit-fix versions with --ignore-scriptsΒ #1928 composite deferral, .npmrc min-release-age refuted. No open hold-gated PRs in this lane. sec-check β closed Oct 31 (the issues/PRs it cites closed), fix not verifieddocusaurus/preset-classic major). Dependabot alerts API is 403 at contributor tier so that channel could not be cross-checked. Open prior rulings re-read and respected: fix: cross-check the lockfile against OSV in the supply-chain gateΒ #1885 OSV arm (needs-human), fix(ci): install unreviewed audit-fix versions with --ignore-scriptsΒ #1928 composite --ignore-scripts deferral, .npmrc min-release-age refuted. sec-check β closed Oct 31 (no evidence recorded), fix not verifiedcncf/endusers@5b83c01guide β closed Oct 31 (no evidence recorded), fix not verifiedAnalyzed atβ οΈ were computed at an older commit and have NOT been re-verified here.
cncf/endusers@b684795cbe65(branchmain) β the latest commit when this digest was generated. File references that no longer exist at this commit are flagged as outdated. Findings markedmrbobbytables commentedon Oct 21, 2026
Maintainer-approved queue reconciliation: 2026-10-21
The prioritized review and explicit maintainer authorization supersede stale
recommendations in the generated digest. Keep this living advisory issue open.
Resolved or deliberately closed
Correct the remaining coverage interpretation
Issue #1736 is now a bounded maintainer decision about conservative cross-chunk
region attribution. It is not completed and is not a request for more data-shape
fixtures or a 100% browser-region floor.
The initial claim that 19 of 20 regions were proven executed was superseded by
the later analysis of 11 with cross-chunk evidence and 9 unproven, followed by the
PeopleFreshness correction. "Unproven" does not mean "unexecuted." A proposed
reporter change still needs evidence that it cannot credit tree-shaken or
source-map-overlapping code. ADR 0007's 96% browser-region floor remains.
Additional merged fixes, not new findings to file
local and pull-request runs retain the threshold. The merge queue also caught
an environment-dependent test failure, repaired on that same PR before merge.
Daily scheduling reduces detection latency; it does not guarantee discovery
before every pull request.
the existing validation utility module.
grouped and the clone ceiling is lowered.
All five merge items (#1741, #1744, #1739, #1746 and #1749) landed through the
normal merge queue after required checks passed. No ruleset or check bypass was
used.
External blockers remain open
"fixed by swizzling" statement is incorrect: fix: give the navbar search button an accessible name containing its visible textΒ #1631 was closed unmerged because
the maintainer chose the upstream path. Do not restart a local swizzle.
This is an external infrastructure dependency, not another repository change.
Do not revive the retired GitHub Pages/CNAME workflow work.
The generated digest should reconcile against these actual merged, closed, and
explicitly deferred dispositions rather than treating every retained finding or
agent "done" marker as an actionable issue.
mrbobbytables commentedon Oct 21, 2026
P2 handoff: external Hive intake and reconciliation
This is an operator handoff, not a claim that Hive configuration was changed.
The repository has no Hive configuration or authorized-repository allowlist;
the orchestrator's
project.repos, intake prompts and reconciliation state aremaintained externally. Please apply these requirements there.
The maintainer-approved reconciliation in
#23 (comment) remains
authoritative. The generated digest still repeats superseded findings, including
"no mutation-testing gate", the merged automation-PR policy tests and the closed
null-groups browser fixture. A digest footer naming current main does not
re-verify an older reproduction.
result. Distinguish the digest refresh revision from the revision actually
tested. Mark stale evidence explicitly rather than relabeling it as current.
merged fixes, superseding comments, maintainer decisions and explicit
"not planned" dispositions. Preserve unresolved and upstream-blocked items.
Link existing [quality] Pilot: callable-core mutation attribution for CLI validatorsΒ #1752 for CLI subprocess mutation attribution;
do not file another generic "missing mutation harness" issue.
meta-guards without maintainer authorization, no malformed-build-data
browser fixtures, and no request to raise browser-region coverage to 100%.
test: cover GroupLinkStatus' absent-collection fallback in the browserΒ #1742 remains closed as not planned.
assertion strength. [quality] Decision: evaluate conservative cross-chunk e2e region attributionΒ #1736 is a bounded attribution decision,
not evidence that every uncredited region needs a new browser fixture.
Respect the separate producer/reporter identities being repaired in
fix: preserve build, browser capture, and reporter coverage provenanceΒ #1748.
NoCoverageas an accounting observation until calibrated. Theawards-validator pilot recovered substantial existing assertion signal by
propagating child coordinator data; it did not reveal 104 missing tests.
Broader harness/scope changes remain a maintainer decision on
[quality] Pilot: callable-core mutation attribution for CLI validatorsΒ #1752.
automatic invitation to clear them or widen the repository allowlist.
refactor: centralize duplicate/missing-id checks in validate-metrics.mjs and validate-launch-metrics.mjsΒ #1751 remains held; fix: preserve build, browser capture, and reporter coverage provenanceΒ #1748 is returned to hold after
its explicitly authorized repair.
distinguishing verified fixes, superseded duplicates, deliberate policy
closures and still-open blockers instead of repeatedly presenting all of
them as actionable defects.
Acceptance evidence for the external operator: the next digest should no longer
present merged/superseded items above as open implementation work, should retain
#1433 and #1618 as external blockers, and should preserve
the bounded decisions on #1736 and #1752. Keep this
living advisory issue open.
mrbobbytables commentedon Oct 22, 2026
Maintainer-approved P2/P3 reconciliation: 2026-10-22
This is a verified disposition snapshot and an external Hive operator handoff,
not a claim that the generated digest's backing state or configuration has
been changed. Keep this living issue open. The prior reconciliations remain
authoritative:
#23 (comment)
#23 (comment)
Merged fixes and completed tracking
Separately scoped work and retained decisions
2026-10-22T17:12:06Z as 5c1ceff. The issue
is closed. Both call sites preserve presence checks, messages and ordering.
extraction under [quality] Extend the merged callable-core mutation pattern to scripts/validate-architecture-assets.mjsΒ #1759. Its implementation is published as
refactor: expose the architecture-assets validator as a callable coreΒ #1787; use that PR for live check/queue/merge state. Scoped
mutation measured 304 killed / 8 individually triaged equivalent survivors /
0 NoCoverage / 97.44%. All 35 behavioral survivors from the initial campaign
were killed. This is not a broad validator rollout or
authorization for new mutation globs, workflows, thresholds or runner
bridges. The assets validator is filesystem-only; JSON input contracts
copied from the awards template do not apply.
was corrected. Producer/reporter provenance delivered by fix: preserve build, browser capture, and reporter coverage provenanceΒ #1748
is separate from deciding conservative cross-chunk attribution. The browser
region floor and ADR0007 reachability rule are unchanged.
finding had been folded into it. Its body now distinguishes completed SVG
work from the remaining scope/validity decision. No MDX export or structural
change was implemented or approved by the SVG repair.
Launch blog post: review and commit the milestone-9 draft (LAUNCH.md milestone 11)Β #1778 needs the maintainer's draft and content approval;
a11y: search button accessible name does not contain its visible label (WCAG 2.5.3)Β #1618 retains the chosen upstream accessibility path.
designated maintenance batch. Their holds were not released.
Required external reconciliation
digest must not continue calling them open implementation work merely
because an old reproduction or agent record remains.
MetricsDashboard repair and automation-PR policy tests recognized as
delivered. Keep the deliberately closed null-groups browser fixture closed.
each finding. A footer naming current main does not re-verify old evidence.
incidental filename mentions in a comparison table. The SVG issue mentioned
mdx-escape.mjs for comparison; that did not make it an MDX component tracker.
The resulting fold must not silently close unrelated work with a SVG PR.
authorizations. This batch's approval is not permission to release new PR
holds, widen HIVE_REPOS or increase automation scope.
There is no Hive configuration or authorized-repository allowlist in this
repository. Apply backing-state, intake and project.repos changes in the
external orchestrator, then verify the next digest against these dispositions.
mrbobbytables commentedon Oct 22, 2026
Reconciliation note: the surviving-mutant backlog that the quality agent was filing per file was cleared in bulk under #1788 (full tree 82.09% to 96.24%, run 39845001035). Per-file mutant findings opened before 2026-10-22 against
src/orscripts/lib/are likely already resolved; please re-verify against main before re-filing.hivecommons-hive commentedon Oct 25, 2026
quality lane, 2026-10-25 β two sub-remit observations, no issue and no PR
Filed here rather than as issues under ADR 0008 rule 2: neither names an effect
under rule 1, so neither is mine to open. Both are verified against
mainatc20e9e4; the evidence is written out so a maintainer can act on either withoutre-deriving it.
1.
scripts/collect-metrics.mjsbuilds a cncf/landscape URL that 404sscripts/collect-metrics.mjssets the landscape source URL tohttps://github.com/cncf/landscape/blob/main/landscape.yml. That repository'sdefault branch is
master, notmain:The value is carried into
data/metrics.jsonundersources.landscape.sourceUrl.Why this is not a rule-1 broken link. Nothing renders it. The only reader of
a metrics
sourcesblock issrc/components/MemberDirectory/DirectoryFreshness.js,which takes
metrics?.sources?.architecturesfrom here and the landscape linkfrom
data/members.jsoninstead β and that one is revision-pinned(
blob/<sha>/landscape.yml, built byscripts/lib/enduser-collector.mjs) andresolves. So this is a wrong string in a dataset, not a dead link a visitor can
click.
If a maintainer wants it corrected, the durable form is the revision-pinned one
scripts/lib/enduser-collector.mjsalready uses, rather than swappingmainformasterβ a floating branch name is what went stale here. Note thatdata/metrics.jsonis occupied ground: #1879 is open against it.2.
onBrokenAnchorsis the one broken-link setting with neither a declaration nor a testdocusaurus.config.jsdeclaresonBrokenLinks: 'throw'andonBrokenMarkdownLinks: 'warn', and both are pinned βtests/site-config.test.mjsfor the first,tests/site-config-broken-markdown-links.test.mjsfor the second, the latter resolving the value through Docusaurus's own
validateConfigrather than reading the literal. The third setting is declarednowhere, and resolving the real config the way the build does gives the
Docusaurus 3.10.2 default:
So the anchor checker's reporting level is an upstream default, and lowering it
to
'ignore'is a one-token edit nothing in the suite would notice β the exacthole the markdown-link test was written to close for its sibling.
Why this is not a rule-1 finding. It would catch nothing today. Scanning
docs/,blog/,src/and the root markdown for site-root links carrying afragment returns zero matches, so there are no broken anchors for the checker to
report at any level. A test pinning the level would move no rule-1 effect, which
puts it squarely in rule 2.
Lane state
Everything else I checked on
mainis green and needs nothing:check:auditpasses,
validate:allpasses (one pre-existingforeignObjectwarning on theSwisscom SVG),
test:unit:coverage:checkpasses at 100.00% source lines and100.00% source regions, and all 360 distinct outbound URLs in the non-member
datasets resolve except
https://www.alolitasharma.com(ECONNRESET), which#1869 is already open for.
π Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5n31| SHA:c20e9e4β hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88
mrbobbytables commentedon Oct 25, 2026
ADR 0008 follow-up: rule 2 pull requests in the 48 hours after merge
ADR 0008 merged on 2026-10-23 (#1848). Between 2026-10-24 and 2026-10-25 the fleet opened four pull requests whose only effect is a repository metric or a new gate no rule 1 effect depends on, all now closed as not planned:
data/*.jsonlink-rot gate; re-file of test: resolve the outbound links the member directory rendersΒ #1857, closed under rule 2 the same daycheck:landscape-driftscript no CI job runstests/tools/, the series the ADR records as ended with test: consolidate the tests/tools mutant premise pinsΒ #1846audit-gate.mjswith no maintainer-filed issueTwo patterns worth recording for the 30-day review (2026-11-23):
test:/ "Test Improvement" and attached to a real in-remit issue withRefs #N([quality] Member profile Sources renders a dead link (www.walmartlabs.com); data-rendered URLs have no link-rot gateΒ #1856 twice), so they read as rule 1 work while the file set is entirely new tooling and tests. Rule 1 is about the effect of the change, not the issue it cites.The remaining open PRs (#1865, #1869, #1871, #1875, #1876, #1877, #1879, #1881, #1884, #1887, #1889, #1893, #1894) all name a user-observable defect and are being merged.
hivecommons-hive commentedon Oct 28, 2026
quality lane, 2026-10-28 β full gate sweep clean, one sub-remit observation
Filed here rather than as an issue under ADR 0008 rule 2: nothing below names an
effect under rule 1.
Sweep at
origin/main1f4a7f4. Every gate reproducible outside CI passes:test:unit:coverage:checkcheck:format,check:lint,check:unusedcheck:duplicationvalidate:allforeignObjectwarning on the Swisscom telco SVG_check:links-databuild:production+test:e2eObservation (harness shape, rule 2).
tests/e2e/focus-trap-trigger-unmounted.spec.jsis the suite's slowest spec and carries no
test.slow(). On this host it finishesin 33.7s, i.e. just past Playwright's 30s default, and fails as
Tearing down "context" exceeded the test timeouton every attempt at the defaulttimeout; its sibling member-directory specs run 22β30s on the same host and pass.
The spec's own steps are not what is slow β scripted against the same build
outside the runner, goto through context close totals under 1s β so this is host
speed, not the test.
It is not failing upstream and needs no change: the last 40
ci.ymlruns aremerge-queue green, and no recent run uploaded a
flaky-specs.jsonartifact, soretries: 1is not masking a flake either. Recording it only so the next agentthat sees this spec red on a slow host recognises it as the environment and does
not file it.
Checked and not re-filed. The
label-content-name-mismatchbaseline intests/e2e/accessibility.spec.jsis accurate as written:docusaurus-plugin-search-local'sSearchBar.jsxrenders<SearchButton>with notranslationsprop, so neitherbuttonTextnorbuttonAriaLabelis reachablefrom
docusaurus.config.js. Decided question, no new information, no issue.No issue and no pull request opened this run.
π Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5n31| SHA:1f4a7f1β hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88
hivecommons-hive commentedon Oct 29, 2026
Re-verified 2026-10-29
aacacc1: ADR 0008 still binding, no in-remit strategic finding. Actionable queue is empty (0 open issues); the two open PRs (#1995, #1976) are maintainer-authored, not agent work. Milestones 1-5 all show 0 open issues (fully closed). Since the prior strategist sweep (Oct 26), PR #1841 (merged, this sweep) deleted ROADMAP.md, MILESTONES.md, data/milestones.json, and the milestone-creation workflow/tests outright β a maintainer decision to retire planning-doc infrastructure, not a gap to fill. Per ADR 0008 'decided questions stay decided,' strategist should not recreate ROADMAP.md or milestone docs for this repo.gh-1841,adr-0008π Hive Agent:
strategist| Instance:hosted-available-lke648397-260827-5n31| SHA:aacacc1β hive: agent=strategist backend=copilot model=claude-sonnet-4-6 copilot=1.0.88
hivecommons-hive commentedon Oct 30, 2026
Re-verified 2026-10-30
99eb7b9: no in-remit strategic finding this sweep.ADR 0008 still binding; #1841 (merged 2026-10-23) was the maintainer's explicit
decision to delete
ROADMAP.md,MILESTONES.md,data/milestones.jsonandevery reference to them. Per "decided questions stay decided," strategist does
not recreate planning-doc infrastructure for this repo.
All five milestones (
Phase 0throughLaunch) still show 0 open issues viagh api repos/cncf/endusers/milestones. The two PRs open as of the priorsweep are resolved: #1995 merged, #1976 remains open and maintainer-authored
(not agent work). 17 commits landed on
mainsince the last strategist sweep(Oct 29), all routine content/metrics/CI work with no roadmap-shaped gap or
adoption blocker surfaced.
No issue and no pull request opened this run.
π Hive Agent:
strategist| Instance:hosted-available-lke648397-260827-5n31| SHA:99eb7b9β hive: agent=strategist backend=copilot model=claude-sonnet-4-6 copilot=1.0.88
hivecommons-hive commentedon Oct 30, 2026
quality lane, 2026-10-30 β production sweep clean, one sub-remit observation
Swept
mainat5b83c01. Filed here rather than as an issue or PR underADR 0008:
the one thing found is a consistency gap with no reachable user-visible effect today.
What was checked (all clean)
npm run validate:allβ all 13 validators pass (102 members, 155 landscape records, 83 talk links, 5 born projects, 4 theme backgrounds).https://endusers.cncf.io: every one of the 47sitemap.xmlURLs answers200./img/cncf-projects/...and/img/architectures/...path referenced fromdocs/anddata/resolves to a committed asset.architectures[].idon a member profile (MemberProfile's/architectures/<id>links) has a page underdocs/architectures/.mainworkflow health:refresh-members,refresh-metrics,refresh-community-people,refresh-radar-reports,audit-scheduleandcheck-linksall green on their latest runs; no required check red onmain.Argo/ArgoCD/Argo Workflowstriple in the project select, which is already covered by held PR π fix(architectures): list the Argo project once in the project filterΒ #2022 β confirmed still live in the server-rendered/architectures/HTML.Sub-remit observation: the tag select is the one filter comparator left unpinned
#2016 pinned English collation at the eight filter-option builders
(
compareLabels,a.localeCompare(b, 'en')). The ninth list in the samefunction was not changed β
useArchitectureFilterOptionsstill sorts the tagselect with a bare
tagKey(a).localeCompare(tagKey(b))(
src/components/ArchitectureFilters/index.js), which uses the runtime'sdefault locale rather than the pinned one.
This is not the defect #2016 fixed:
tagKeylowercases, so the lowercaseblock that motivated that PR cannot occur here. The only residual difference is
that the build host and the visitor's browser could collate the list
differently. Every current tag is
[a-z0-9 ]aftertagKey, and no localeorders that alphabet differently from
en(the usual divergences β Danish/Norwegian
aa, SwedishΓΆ, German phonebook β need characters or digraphs notag has), so there is nothing a visitor can observe today. Recording it only so
the next reader of that function knows the omission was looked at rather than
missed; worth a line if a non-ASCII tag ever arrives from upstream.
β hive: agent=quality
π Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5n31| SHA:5b83c01hivecommons-hive commentedon Oct 31, 2026
[quality] Latent:
/metricsnumbers are formatted in the visitor's locale, not a pinned oneAdvisory only β this is not observable on the production site today, so per
ADR 0008
it gets this comment rather than an issue or PR. Recording it because the trigger
is a data value crossing a threshold, not a code change, so it will arrive without
anything in
src/being touched.What
src/components/MetricsDashboard/index.jsformats three user-visible numbers withno locale argument, so
Intlresolves the host default::72β`${card.value.toLocaleString()} ${card.suffix || ''}`(lifecycle cards):119β{metric.value.toLocaleString()}(metric cards):165β{series.values.at(-1)?.value.toLocaleString()}(chart range)The page is server-rendered once at build time (Node,
en-US) and hydrated in thevisitor's browser, where the host default is whatever the visitor's OS/browser is.
Why it is latent, and what makes it live
Grouping separators only appear at
|value| >= 1000. Every value indata/metrics.jsonis currently below that:Below 1000 every locale renders the same digits, so there is nothing to see. Once a
value reaches 1000 the two sides disagree:
endUserMembersis the one that will get there (649 and rising). At that point anon-
envisitor gets markup that differs from the SSR HTML, which React 18 treatsas a hydration mismatch for that subtree.
Why the suites will not catch it
tests/metrics-dashboard.test.mjs:120,263,352,375andtests/e2e/metrics-dashboard.spec.js:101,238,314build their expected strings withthe same unpinned
value.toLocaleString(), so expectation and subject move togetherin any locale. A guard would have to assert the pinned output literally.
The repo already decided this question for dates
src/components/shared/formatDate.jspins'en-US'and writes down the samereasoning ("the site is built once (in UTC) and hydrated in the visitor's browser
... would ... mismatch the server-rendered text"), and
src/components/shared/compareLabels.js:14pins
'en'after d760cde. These three calls are the remaining unpinned sites insrc/. The fix istoLocaleString('en-US')at each; whether that is worth doingbefore a value crosses 1000 is the maintainers' call.
Verified at
01ceee8(npm run test:unit:coverage:checkgreen, src 100% lines/regions).β hive: agent=quality
π Hive Agent:
quality| Instance:hosted-available-lke648397-260827-5n31| SHA:01ceee8