LearnNewsExamplesServices
Frontmatter
id16872
titleRevert the close-relation audit: the PR-body lint bounds anchor COUNT, not size
stateClosed
labels
bugaibuild
assigneesneo-opus-grace
createdAtAug 10, 2026, 12:05 PM
updatedAtAug 10, 2026, 1:45 PM
githubUrlhttps://github.com/neomjs/neo/issues/16872
authorneo-opus-grace
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 10, 2026, 1:45 PM

Revert the close-relation audit: the PR-body lint bounds anchor COUNT, not size

neo-opus-grace
neo-opus-grace commented on Aug 10, 2026, 12:05 PM

Context

Operator decision: full revert. ca47cfc37d (#16829 / PR #16831, 2026-08-09 21:33, @neo-kimi-iris) is reverted in its entirety, restoring agent-pr-body-lint.yml to the exact version that preceded it.

This ticket originally proposed truncating the audit's output. That was overruled in favour of restoring the known-good version, and the operator's call is the right one under today's conditions: a surgical fix to a twelve-hour-old workflow, authored by someone unavailable, on the morning a client deployment is at stake, is a second change to reason about rather than one removed.

The Problem

The lint was written with an explicit verbosity bound, stated in its own source:

"Even visible-list naming is bounded — at most ONE diagnostic anchor in the prose"

That is implemented as diagnosticAnchor = missingVisible[0]it caps the number of anchors named, not their length. Every anchor was a short structural string, so count and size were the same thing.

The close-relation audit pushes a single element onto missingVisible built as "close-relation audit (#16829): … Findings: " + closeRelationFindings.join(" | "), where each finding quotes an entire acceptance criterion verbatim. One anchor became an unbounded paragraph — and because it sorts first, it renders as the inline hint and again in the <details> block.

Measured on today's PRs, agent-facing bot comment size: #16869 6,594 chars, #16851 3,852, #16865 3,257 — each payload duplicated.

Why it costs more than screen space. The consumer is an agent and the comment lands in its context on every failing push. The original message was deliberately terse — a pointer to the workflow file — on the reasoning that naming anchors invites composing a substitute template instead of reading the real one. A payload reproducing a ticket's entire AC list inverts that: pattern-matching the dump becomes cheaper than opening the template, which is exactly what the terse design existed to prevent.

The Architectural Reality

  • .github/workflows/agent-pr-body-lint.yml:185-193 — the findings push; join(" | ") is the unbounded term.
  • Same file :276const diagnosticAnchor = missingVisible[0], the count bound.
  • Same file, <details> block — renders the full list, so the payload appears twice.
  • test/playwright/unit/ai/scripts/lint/prBodyCloseRelationAudit.spec.mjs — added by the same commit, removed by the revert.

The Fix

git revert ca47cfc37d. The commit was purely additive (95 lines of workflow, a 182-line spec), so the revert restores the prior file exactly.

Verified, not assumed: the reverted agent-pr-body-lint.yml is byte-identical to ca47cfc37d~1's version (diff -q, no output). The spec file is removed. 301 passed across test/playwright/unit/ai/scripts/lint/. The only surviving references are in resources/content/pulls/**, which are synced historical PR-body mirrors, not live code.

Acceptance Criteria

  • agent-pr-body-lint.yml is byte-identical to its state at ca47cfc37d~1. Receipt: diff -q against git show ca47cfc37d~1:… produces no output.
  • The audit's spec file is removed with it, so nothing tests deleted logic. Receipt: prBodyCloseRelationAudit.spec.mjs no longer exists.
  • No dangling references in live code. Receipt: the only hits for auditCloseRelations / close-relation audit are under resources/content/pulls/** — synced PR mirrors, historical by construction.
  • The lint suite is green after removal. Receipt: 301 passed across test/playwright/unit/ai/scripts/lint/.
  • The workflow still parses and retains its structure. Receipt: 244 lines, on: and jobs: present; the job's own run on this PR is the live proof.

Out of Scope

  • Re-landing the audit in a bounded form. The detection was valuable — it caught ten genuinely unticked ACs on #16853 this morning and the author fixed them. Whether and how it returns is @neo-kimi-iris's call on her own work, not a decision to make while she is unavailable.
  • The size-vs-count bound in the surrounding message composition. Real, latent, and not worth a second change today.

Avoided Traps

  • "Fixing" it instead of reverting. A truncation patch is a new change to reason about, on a workflow that gates every PR, on a morning where a client deployment is the priority. Restoring a known-good version is the lower-variance move and it was the operator's call.
  • Blaming the audit. It exposed a latent flaw — a bound counting items in a channel whose items were assumed short — and it found real defects while it ran.
  • Deleting the workflow line rather than the commit. A hand-edit would leave the spec behind, testing logic that no longer exists.

Related

#16829 / PR #16831 — the reverted work, authored by @neo-kimi-iris, unavailable today. #16776 — the split pattern the removed message cited.

Origin Session ID: 3c27118d-2de2-4579-bb42-1062c34cb895

Retrieval Hint: query_raw_memories("PR body lint revert close-relation audit diagnostic anchor bounded by count not size")

tobiu referenced in commit a3f428e - "revert(build): restore the PR-body lint to its pre-audit version (#16872) (#16873) on Aug 10, 2026, 1:45 PM
tobiu closed this issue on Aug 10, 2026, 1:45 PM