Skip to content

docs: spec 016 and 017 design findings from the #3500 review #3519

Open

Description

@eleshar

CodeRabbit raised 13 Major findings on #3500 against specs 016 and 017. These are design decisions for the spec owners, so most are tracked here rather than changed in the move. Part of #3464.

Status update (2026-09-26, after #3500 merged as 62c9344f31): the premise that #3500 would move the specs
"unchanged from their agreed sources" no longer holds. The move went through several review rounds, and the
mechanical defects found on the way were fixed in place rather than deferred. Six items below are now closed and
ticked; the remainder are still open and still need an owner decision. #3434, which carries the pre-merge copies of
the same files, will reintroduce the closed items if merged without a rebase — see the comment on that pull request.

Spec 016: changelog agent (owner decision)

  • Token handling (contracts/cli-interface.md L41, L126, L139): the documented --github-token flag and GITHUB_TOKEN=ghp_xxxx example put tokens in shell history and process arguments; validate.sh forwards the token as an argument. The contract documents the shipped validator (docs: changelog-agent - Document specification decisions #3470 item 1), so fixing it means changing the validator to accept the token from the environment only.
  • Authorisation for changelog-check-links (contracts/rest-api-interface.md L91–L100): only changelog-validate defines authentication. A caller-supplied github_repo must be checked against the authenticated installation, with the token restricted to that repository.
  • One error payload schema: the data-model.md table defines error_code, expected_format and actual_value, but the example at L102 and spec.md L109 use error_type, and research.md L160–L172 uses type/actual/expected/current_value. Pick one and align all three.
  • Issue vs PR link rules (data-model.md L212, L254): "merged only" (decided on refactor: changelog-agent - establish quality framework and spec 015 structure #3434) fails valid issue references, since issues have no merged state. Resolve the reference type first, then define a status rule per type.
  • Changelog exemption by branch prefix (spec.md L101, research.md L210–L236): Q1 decided "automatic bypass for chore/ and deps/". CodeRabbit notes that a user-facing change on such a branch then skips validation. Confirm the decision, or switch to the meta:changelog-exempt label (research.md L320) as the trusted signal.

Spec 017: CI failure remediation (marked Resolved 2026-09-22)

The findings concern the evidence standard of a completed investigation. Apply them to the method if 017 is reused:

  • Keep inconclusive failures as INVESTIGATING, not "ENVIRONMENTAL (likely)" (contracts/pr-comment-template.md L123, quickstart.md L391).
  • Compare per-entry changelog results, not the 6/54 aggregate (data-model.md L29–L32; plan.md L31–L33, L118, L153, L233).
    • Outcome: closed in docs: specs - land CI remediation, changelog agent and agent consolidation specs #3500 07cf08f282 and 0ea0b3e6c2. The root npm run validate:changelog script runs the repository-wide safety audit and reports no per-entry results, so it cannot establish an entry-level baseline; both branches now run .github/validation/changelog/bin/validate.js, which does. The stale 6/54 figure itself is tracked in the spec's own resolution note as no longer accurate.
  • Match exact finding identity (location and content), not message or rule text (data-model.md L68–L69, L107–L108, L222–L224; plan.md L119–L123, L160, L167, L187).
  • Different errors on both branches do not establish an environmental cause (data-model.md L148).
  • Make "ready to merge" conditional on per-category evidence (plan.md L146, L199).
  • Compare against the failing run's base and head SHAs, not the current develop (quickstart.md L33).
  • Compare failing test names, not grep -c "FAIL\|PASS" counts (quickstart.md L562).
  • Attribute failures by evidence, not timing (spec.md L81).

Second CodeRabbit CLI pass on #3500 (2026-09-26)

coderabbit review --agent --base develop on 46b201dd8f (19 files) returned 10 further findings after the first pass's 10 were addressed. Most are the same defects already listed above, re-raised on the corrected prose, so they need no new decision. The genuinely new ones are listed first.

New — needs a decision

  • Limit automatic labelling to non-exemption labels (spec.md L77, User Story 4). The scenario has validation apply changelog labels with no manual step, which implies the workflow may attach meta:no-changelog — the exemption label — on its own. An exemption must be an explicit human act; if the workflow can set it, the exemption is not an audit trail.
  • Run the same entry validator on both branches (017 quickstart.md L72). The develop comparison writes .json from the feature-016 engine while the audit-branch comparison still writes .txt from the root validate:changelog safety audit, so the two sides are not comparable. Both must use .github/validation/changelog/bin/validate.js.
  • Test the shipped workflow, not a local simulation (016 quickstart.md L319). The scenario reconstructs the gate's decision in shell, so it verifies the scenario's copy of the logic rather than changelog-unified.yml. Either drive the real workflow or state explicitly that the scenario documents intent and is not a gate test.

Already covered above — re-raised, no new decision

  • 017 quickstart.md L424 inconclusive classification → "Keep inconclusive failures as INVESTIGATING"
  • 017 pr-comment-template.md L51 category verdicts → same item
  • 017 quickstart.md L397 wrong branch → "Compare against the failing run's base and head SHAs"
  • 017 quickstart.md L565 lint loses the file type → "Compare failing test names, not grep -c counts"
  • 017 plan.md L344 post without re-verification → "Make 'ready to merge' conditional on per-category evidence"

Withdrawn after verification (2026-09-26)

Tracked elsewhere

Note on convergence

Two further CLI passes each returned 10 findings. The unresolved tail is about the prose of specifications for a system that is not built, so there is no implementation to check a claim against and each pass raises new hypotheticals. #3470 already carries the spec 016 design decisions and the stale-lock/OS-lock question that the recovery-mutex work touches. Continuing to review in place is not converging; these checklists are the right home for the remainder.

Activity

  1. linear-code commented on Sep 23, 2026

    @linear-code
  2. eleshar commented on Sep 23, 2026

    @eleshar
    ContributorAuthor

    5 more from the #3500 full review (2026-09-23 18:12 UTC), against the same agreed sources (016 = #3434 b29c26b, 017 = audit branch):

    Spec 016

    • Checklist contradicts itself (checklists/requirements.md L13–L15 vs L103–L106, L112): "No implementation details" is marked not met at the top and passed at the bottom, and the summary says all items pass. Keep it unchecked or record an explicit exception, then fix the summary.
    • Exit codes vs --strict (contracts/cli-interface.md ~L150): --strict defaults to false and the JSON example reports valid: true with an unmerged link, but the exit-code table gives unmerged links code 1. Define when an unmerged link fails.
    • Frontmatter closing delimiter (quickstart.md L197): the check also matches ---oops. Require end of line or end of file after ---.
    • Stale-lock recovery is not atomic (research.md ~L278): two contenders can pass the re-stat checks, and the second can unlink a new live lock, because unlink works by path, not by the checked inode or token. Serialise recovery, or specify a compare-and-remove.

    Spec 017

    • Checklist claims more than the evidence (checklists/requirements.md L38): spec.md says User Story 3 still needs investigation and Stories 2–4 are unverified against current develop. Mark those items incomplete, or narrow the claims to the verified categories.
  3. eleshar commented on Sep 23, 2026

    @eleshar
    ContributorAuthor

    The 5 findings in the comment above are fixed at the owner decision (Chris, 2026-09-23): c2f1fc1 on #3500 and ac4cd69 on #3434. The 016 files are identical in both PRs. The original 13 above remain open for the spec owners.

  4. eleshar commented on Sep 27, 2026

    @eleshar
    ContributorAuthor

    Clarification: "Spec 016" and "Spec 017" here are develop's, not the new ones

    I have been working the spec-numbering collisions on #3525 and #3532 and nearly filed the wrong conclusion about this issue, so recording what is actually what.

    This issue's sections are about the specs that already exist on develop:

    The open items in those two sections are therefore unaffected by the two PRs currently colliding:

    PR adds collides with tracked here?
    #3525 016-claude-cloud-environment 016-changelog-agent-quality no — different spec
    #3532 017-qodo-pr-agent-integration 017-ci-failure-remediation no — different spec

    So #3519 does not block either PR. The only coupling is the number, and CATALOG.md on develop sets the rule: take the highest number, and 017 is currently the highest, so 018 is next. Both PRs want it, which is why I have asked you to decide the allocation between them rather than picking one.

    This issue's own status is unchanged and still needs an owner: the open items under both headings are the changelog-agent token handling, changelog-check-links authorisation, and seven spec-017 items. I have not touched any of them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions