Skip to content

changelog.d: four fragments on master do not end in a newline, so the next appended entry concatenates onto the previous bullet - #351

Merged
jaylfc merged 1 commit into
masterfrom
exec/tsk-v2pr2b
Aug 18, 2026
Merged

changelog.d: four fragments on master do not end in a newline, so the next appended entry concatenates onto the previous bullet#351
jaylfc merged 1 commit into
masterfrom
exec/tsk-v2pr2b

Conversation

@jaylfc

@jaylfc jaylfc commented Aug 18, 2026

Copy link
Copy Markdown
Owner

CARD TITLE (intent, not commit subject): changelog.d: four fragments on master do not end in a newline, so the next appended entry concatenates onto the previous bullet

Autonomous build of board card tsk-v2pr2b.

REVIEW WARNING (automated): this card's text asks for tests, but the diff changes no test file. Either the acceptance criteria are unmet or the card needs correcting. Do not merge without resolving this.

Files:
changelog.d/tsk-35fsll-eventqa-exit-code.md | 2 +-
changelog.d/tsk-cwzaab-fix-quoted-error-strings.md | 2 +-
changelog.d/tsk-nup2ny-fix-possessive-apostrophe.md | 2 +-
changelog.d/tsk-ocjut3-stream-rejection-buffer.md | 2 +-
changelog.d/tsk-v2pr2b-fix-missing-changelog-newlines.md | 2 ++
5 files changed, 6 insertions(+), 4 deletions(-)

@qodo-code-review

Copy link
Copy Markdown

ⓘ Qodo reviews are paused because your trial has ended. Ask your workspace admin to add credits to resume reviews. Manage billing

@coderabbitai

coderabbitai Bot commented Aug 18, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jaylfc, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 27 minutes

Limit details: You’ve used all 1 included review currently available under your plan.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8e2beac3-9b91-44ad-94b1-7eed9bd59b24

📥 Commits

Reviewing files that changed from the base of the PR and between 5796bc2 and 8ac7ae7.

📒 Files selected for processing (5)
  • changelog.d/tsk-35fsll-eventqa-exit-code.md
  • changelog.d/tsk-cwzaab-fix-quoted-error-strings.md
  • changelog.d/tsk-nup2ny-fix-possessive-apostrophe.md
  • changelog.d/tsk-ocjut3-stream-rejection-buffer.md
  • changelog.d/tsk-v2pr2b-fix-missing-changelog-newlines.md

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gitar-bot

gitar-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown

Important

You are using the Gitar free plan. Upgrade to unlock code review, CI analysis, auto-apply, custom automations, and more.

Gitar

@kilo-code-bot

kilo-code-bot Bot commented Aug 18, 2026

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (5 files)
  • changelog.d/tsk-35fsll-eventqa-exit-code.md
  • changelog.d/tsk-cwzaab-fix-quoted-error-strings.md
  • changelog.d/tsk-nup2ny-fix-possessive-apostrophe.md
  • changelog.d/tsk-ocjut3-stream-rejection-buffer.md
  • changelog.d/tsk-v2pr2b-fix-missing-changelog-newlines.md

Reviewed by step-3.7-flash · Input: 28.2K · Output: 3.3K · Cached: 213.5K

@kilo-code-bot kilo-code-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found.

@jaylfc

jaylfc commented Aug 18, 2026

Copy link
Copy Markdown
Owner Author

MERGE. The fix is complete, it changes nothing but the trailing byte, and the enumeration was checked in both directions.

Re-measured on a trial merge of 8ac7ae71 into origin/master at review time. Note master moved during this review — #349 landed as 2239dcab — so this was re-trial-merged against the new head rather than the number being carried over. Merge-base 5796bc26.

The defect, and that the fix covers all of it

The card names four fragments. Rather than take that list as the scope, I enumerated every fragment in changelog.d/ myself and reconciled both directions:

                                            master 2239dcab   trial merge
changelog.d fragments total                      26              28
  not ending 0x0a                                 4               0

the 4 on master:
  tsk-35fsll-eventqa-exit-code.md            0x2e '.'
  tsk-cwzaab-fix-quoted-error-strings.md     0x2e '.'
  tsk-nup2ny-fix-possessive-apostrophe.md    0x65 'e'
  tsk-ocjut3-stream-rejection-buffer.md      0x2e '.'

Found-not-claimed: none. Claimed-not-found: none. The four the card named are exactly the four that exist, and after the merge 0 of 28 fragments lack a trailing newline. The new fragment this PR adds ends 0x0a itself, which is the failure mode a newline-fixing PR is most likely to walk into.

It changes only the trailing byte

A +1/-1 on a last line could silently reword the line. It does not — comparing each fragment's prose with the trailing newline stripped from both sides:

SAME prose: tsk-35fsll-eventqa-exit-code
SAME prose: tsk-cwzaab-fix-quoted-error-strings
SAME prose: tsk-nup2ny-fix-possessive-apostrophe
SAME prose: tsk-ocjut3-stream-rejection-buffer

Gates and suite

git grep -nE '^(<<<<<<< |=======$|>>>>>>> )'   no output
scripts/check_deleted_symbols.py --base origin/master   deleted-symbols-guard: clean
scripts/normalise_handle_gate.py                        normalise-handle-gate: clean
scripts/check_witness_token.py                          witness-gate: clean
full suite on the trial merge                           1591 passed, 12 skipped in 156.72s

1591 is the post-#349 master baseline unchanged, which is the correct reconciliation for a change that touches only changelog.d/*.md and adds no tests. The card asks for no test here and it is right not to — a whitespace assertion on named files is vacuous, and this is the fifth docs-only card in a row where the "card asks for tests but the diff has none" warning would be a false positive.

One non-blocking accuracy note on the new fragment's wording

The fragment this PR adds justifies the fix like this:

…now each end with exactly one \n, preventing the next appended entry from concatenating onto the previous bullet.

That consequence does not exist in this repository today. There is no changelog assembly step at all: no towncrier in pyproject.toml, no script in scripts/ that reads changelog.d/, and no CI step that concatenates fragments. Nothing currently appends to these files programmatically, so nothing would concatenate.

The fix is still correct on the grounds the card actually establishes — the house norm, measured at 38 of 40 .md files ending 0x0a, and POSIX text-file convention. It is only the stated mechanism that overreaches. Not worth blocking or bouncing a five-line docs fix over one clause, and not worth a card; recording it so the claim is not later cited as evidence that a build step exists.

Interaction with #352

These two were flagged as possibly colliding, since tsk-sgia5s and tsk-v2pr2b are the same species and #352's card suggests batching them. They do not collide. #351 touches four existing fragments plus its own new one; #352 touches scripts/normalise_handle_gate.py plus its own differently-named fragment. No shared path, and this merge does not change anything #352 depends on.

Stated limitations

@jaylfc
jaylfc merged commit c928abc into master Aug 18, 2026
7 checks passed
jaylfc added a commit that referenced this pull request Aug 18, 2026
…of/review_by coercion guards forward with tests (#347)

Revision of the closed #312. All three blockers from tsk-agi5ph resolved, both non-blocking items
addressed, and the tests verified red-first rather than taken on the body's word.

RED FIRST, this PR's test files run UNCHANGED against #307 (swap proven by md5 first:
test_api.py d2736eae and test_collections_ingest.py c5787bc1 identical on both sides;
api.py ce0ac0e0 (#307) vs ccc68390 (#347) genuinely differs):

    the card's five-case table, on #307:
      FAILED  coerce_iso_string_timestamp_returns_hits    ValueError
      FAILED  coerce_int_review_by_returns_hits           TypeError '<' int/str
      FAILED  coerce_list_review_by_returns_hits          TypeError '<' list/str
              coerce_str_review_by_overdue_is_past_review  passed
              coerce_plain_metadata_returns_hits           passed
      3 failed, 2 passed          -- failure-for-failure identical to the card's prediction
    all six coercion tests on #307: 4 failed, 2 passed  -- exactly the body's "4 of 6" claim

BLOCKER 2, the dropped producer, restored rather than rebuilt: taosmd/collections.py is
byte-identical to #307 (md5 744af0bb on both). The producer is genuinely absent on master --
the end-to-end test cannot even import there (ImportError: cannot import name
'_parse_front_matter'), so it discriminates. indexed_at is written at collections.py:909.
The PR body states the chosen direction explicitly, as acceptance required.

BLOCKER 3: the false UnboundLocalError changelog entry is gone; replacement fragment ends 0x0a.
Guards are now symmetric (api.py:486 as_of, api.py:494 review_by).

Gates clean (deleted-symbols, normalise-handle, witness), no conflict markers, no
Removes-Intentionally trailer. Suite 1617 passed, 12 skipped -- reconciles as the post-#351
baseline 1591 + the 26 tests added. The card's bar was >1435.

STATED LIMITATIONS.
- test_search_hit_metadata_always_has_doc_currency_fields PASSES on #307 too. It is a valid
  output-shape contract guard but is NOT evidence anything was fixed; the discriminating tests
  are the four coercion cases.
- The red-first baseline is #307, not master: against master these tests cannot import at all,
  so master is useless as a red baseline for the producer half.
- The PR body reports no suite count, which the card's acceptance asked for in as many words.
  Ran it here rather than bounce correct work. This is the sixth PR in that pattern
  (#340, #341, #345, #346, #348, #347) and is worth fixing at the source.
- api.py:498 builds is_past_review in a 110-character expression. No line-length rule exists
  in the repo, so style only; no change requested.
jaylfc added a commit that referenced this pull request Aug 18, 2026
…tab lines name the canonical in-repo script (#354)

Card tsk-bse2el. Replaces the hardcoded /home/jay/.taos-fleet-tools/resume_arm_time.py
in system_crontab_block and do_fire with _HELPER_PATH = os.path.realpath(__file__).

WHY THIS MATTERED MORE THAN THE CARD SAID
The out-of-repo path the crontab lines named is not just a different copy, it is a stale
pre-#337 one: md5 7c54e86e32 / 40843 bytes vs the repo's 446505544c / 42188 bytes, 45 lines
of divergence, and its do_fire has NO A2A bus posting at all. On master an armed resume
fired, wrote a log line, and notified nobody.

Verified on a TRIAL MERGE into origin/master dddbb5d (merge-base re-derived as 72ade2c
after #355 moved master mid-review), never on the PR head.

- Real CLI (`resume_arm_time.py 2026-08-18T07:00:00+00:00`, read-only): master emits the
  .taos-fleet-tools path; the trial merge emits the invoking checkout's own script.
- Mutation analysis: against the OLD impl the 4 touched tests all fail, but every one fails
  with `AttributeError: no attribute '_HELPER_PATH'`, which only proves the symbol is new.
  Against a MUTANT that DEFINES _HELPER_PATH but hardcodes it back, only 2 fail:
    test_do_fire_posts_resume_due_to_bus            FAILED  <- discriminates
    test_do_fire_bus_failure_writes_visible_record  FAILED  <- discriminates
    test_system_crontab_block_names_usr_bin_python3 PASSED  <- vacuous wrt this defect
    test_do_fire_runs_as_subprocess                 PASSED  <- vacuous wrt this defect
  The discriminating pair anchors on SCRIPT, an origin independent of the implementation.
  Followed up as tsk-vqfjsm; genuine coverage exists, so not a blocker.
- Changelog fragment ends 0x0a, so it does not reintroduce the #351 defect.
- Conflict markers, deleted-symbols guard, handle gate, witness gate: clean.
- Full suite on the trial merge: 1617 passed, 12 skipped. Reconciles as 1617 = 1617 + 0.

STATED LIMITATIONS
- The emitted path now depends on WHERE the script is run. From a worktree or temp copy it
  pins a path that will be deleted; since the line is `<helper> --fire ... && (crontab -l |
  grep -v ...) | crontab -`, a missing helper short-circuits the && and the self-removal
  never runs, turning a one-shot into a permanent annual entry. Filed as tsk-bxdfvz.
- Nothing here reconciles the two copies. The stale .taos-fleet-tools file is still on disk
  and still 45 lines behind; this only stops the repo copy pointing at it. Untracked.
- os.path.realpath resolves symlinks, so a symlink install would be pinned by its target.
  No such install exists today.
- My first suite run on this PR reported 1 failure. That was my own contaminated worktree
  (I reverted the tree mid-run), not the PR. Rebuilt, proved impl+tests by md5 before and
  after, re-ran clean. Recorded on the PR.
jaylfc added a commit that referenced this pull request Aug 18, 2026
… NOT YET PINNED (#357)

Card tsk-r44fqf. The README pinned a byte size and sha256 for longmemeval_s_full.json that
nothing on this box can verify. This retains the claimed values, labels them unverified, and
shows the stat/shasum commands a future reader should run -- matching the style already used
for longmemeval_s_cleaned.json.

Verified on a TRIAL MERGE into origin/master 10d60ab (merge-base re-derived as e759336 after
#355 and #354 both moved master during the review), never on the PR head.

- Card premise holds: `find /home/jay -name longmemeval_s_full.json` returns 0 hits. The README
  also claims a canonical copy on the project bench host, so I tried to settle the pins rather
  than hedge them: ssh to the bench host TIMED OUT. The values genuinely cannot be confirmed here.
- Arithmetic re-derived on the merged text: 277383467 bytes -> 264.53 MiB vs claimed 265 MiB OK;
  15388478 bytes -> 14.68 MiB vs claimed 14.7 MiB OK.
- This file has produced three invented-precision defects (#339, #342, tsk-7cl7rk). This PR does
  the opposite: it retains the claimed values and labels them, rather than inventing replacements.
- Conflict markers, deleted-symbols guard, handle gate, witness gate: clean.
- Changelog fragment ends 0x0a; does not reintroduce the #351 defect.
- Full suite: 1617 passed, 12 skipped. Reconciles as 1617 = 1617 + 0 (docs-only).

STATED LIMITATIONS
- "NOT YET PINNED" reflects this box plus one failed reachability check, NOT proof the pins are
  wrong. If the bench-host copy exists the values may be correct and merely unconfirmed. The
  wording is scoped to "this machine" and does not overclaim.
- The `# expect: <sha>` line is removed from the verify snippet. Defensible while unpinned, and
  the sha is still stated above it, but a reader copying only the code block loses it inline.
- Does NOT fix the missing trailing newline on this same README (last byte still 0x2a after this
  merge). That is tsk-lkctqr's item.
- The PR body's file list is FABRICATED: it claims 24 files / 1863 insertions (a list belonging to
  #349's mentions work); the real diff is 2 files / 13 insertions. The diff is correct and is what
  was reviewed. Seventh PR in this write-up pattern.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant