fix(testing): make the date guard discriminating, and correct two records it exposed - #3167
Conversation
…e, a missing reverse pointer Three items found by adversarial verification of #3097 and #3094, each re-confirmed against origin/main before this branch. testing 0.7.3 -> 0.7.4 — cant-fail-scan.test.sh asserted `date: 20` for the `--findings` frontmatter date. That is a truncated prefix of a structured value: it passes for the emitter's real `2026-08-23T04:37:40Z` and equally for `2026-08-21T13-36-00Z`, a hyphenated time that is ISO-8601 in neither profile — the same guard shape that pinned ai-slop's emitter bug instead of catching it, sitting inside the skill whose purpose is finding tests that cannot fail. Now anchored to the full extended form with an explicit Z, via a new `assert_matches` helper so shape assertions have somewhere to go other than a prefix check. Confirmed discriminating: FAILS on both malformed shapes, PASSES on real emitter output. The file's other assertions were re-read; each pins an exact literal a malformed value would not contain, so nothing else was rewritten. overengineering 0.2.0 -> 0.2.1 — findings-artifact.md justified its `date:` field as "Colon-free UTC, Windows-safe, lexically sortable". Windows-safety is a filename property and is meaningless for a field inside a file; this contract fixes one stable filename per home and rejects a timestamped one, so there is no filename to re-site the claim onto either. The rationale now says what is true (compact, unambiguous about its zone, lexically sortable). The FORMAT is unchanged — ISO-basic YYYYMMDDTHHMMSSZ is valid ISO-8601 and this artifact is not a detector-findings adopter. ai-slop 0.3.3 -> 0.3.4 — docs/upstream/cursor-pstack.md names ai-slop's catalog and rewrite guide as where Cursor's `unslop` skill landed, but nothing under plugins/ai-slop/ pointed back; it was the only derived plugin with no citation of that file. The README's existing sentence naming the upstream skill now carries the link. Added there rather than to the published entry that recorded the port, which is history and is not edited. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AqwX2njhiLMWGrMg3QNt4g
|
Claude finished @kyle-sexton's task in 44s —— View job Security review
No security issues found. This PR is test-only and documentation-only:
No GitHub Actions workflows, permissions, dependency pins, auth/authz logic, or data-handling code are touched by this PR. Skip-gate condition 2 (no security-relevant surface after reading the diff) applies — nothing further to report. |
|
Last security-reviewed head: |
|
Claude finished @kyle-sexton's task in 2m 17s —— View job Claude's review
No blocking findings. This is a clean, well-scoped fix. What I checked:
Not independently re-run: the shell test suites, |
|
Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
Second overengineering version collision in a row: main took 0.2.1 for the findings-artifact date-rationale fix (#3167) after taking 0.2.0 for the delta lane (#3146). Main's entries stay where they are and this branch's documentation-only entry moves to 0.2.2. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RiAekqvuMHJs3CjusBbNWH
No linked issue.
Summary
Three items surfaced by adversarial verification passes on #3097 and #3094, each re-confirmed against
origin/mainbefore this branch was cut. One is a test that cannot fail, inside the skill built to find tests that cannot fail. The other two are records that misstate something, in documents whose job is to be accurate.Nothing behavioral changes. All three plugins take patch bumps.
Fix
1 — a non-discriminating guard in
testing:audit's own suite.cant-fail-scan.test.shasserted:That needle is a truncated prefix of a structured value, so it accepts anything beginning
date: 20— including the malformeddate: 2026-08-21T13-36-00Zthat #3097 just removed fromai-slop's emitter, where an identically-shaped guard had been holding the bug in place while passing green.testing:auditexists to detect exactly this, which is why it is worth fixing on principle as well as on merit.Replaced with an anchored shape assertion, via a new
assert_matches <name> <haystack> <ERE>helper added beside the file's three existing asserts so shape checks have somewhere to live other than a prefix match:Proven to discriminate, not asserted. Both assertion bodies run against three inputs, the last produced by actually invoking
cant-fail-scan.sh --findings:date: 2026-08-21T13-36-00Z(hyphenated time)date: 2026-08-21(no time, noZ)date: 2026-08-23T04:37:40Z(real emitter output)Sibling assertions were audited and deliberately left alone.
date: 20was the only needle in the file that is a truncated prefix of a structured value; every other one pins a whole-token literal a malformed value would not contain (type: review-findings, the full table header,| IMPORTANT | high |,left\|\|right, the refusal strings). No test-suite rewrite.2 — a justification that does not hold, in
overengineering's findings-artifact contract. Its frontmatterdatefield was justified as "Colon-free UTC, Windows-safe, lexically sortable". Windows-safety is a filename property — a colon is illegal in a Windows path component and irrelevant to a field inside a file.The format is not changed and was never wrong. ISO-basic
YYYYMMDDTHHMMSSZis valid ISO-8601 and lexically sortable; this artifact has its own consumer (/overengineering:realign) and is explicitly not a detector-findings producer, so nothing obliges it to matchai-slop's extended form. The format specification at all three sites is byte-identical tomain; only the rationale cell changed.The claim is dropped rather than re-sited, because there is no filename to attach it to: this contract fixes "one stable filename per home, rewritten in place" and rejects a timestamped filename by name. The cell now records why colon-freedom does not apply here, so the claim does not quietly return.
3 — the one derived plugin with no reverse pointer to the upstream record. Measured:
plugins/ai-slop/CHANGELOG.mdciteddocs/upstream/cursor-pstack.mdzero times, against at least one citation in each of the eleven other derived plugins.The natural home — ai-slop's #3031 entry — is published history this repo does not edit, so the pointer went to the plugin README instead, onto the sentence that already named Cursor's
unslopskill and the overlap map. Flagged as a new placement: no plugin README citesdocs/upstream/today; all eleven existing citations are in changelogs. Defensible, but new, and easy to relocate if you would rather it went elsewhere.Verification
cant-fail-scan.test.shai-slop detect.test.sh(regression)check-changelog-parity.sh--check/--check-bump/--check-order/--check-preservedcheck-changed-skills.sh origin/maincheck-stale-base-overlap.sh --check origin/mainshellcheckmarkdownlint-cli2on 5 changed files+N -0— additive onlyVersions verified against
mainbefore bumping rather than assumed:testing0.7.3 → 0.7.4,ai-slop0.3.3 → 0.3.4,overengineering0.2.0 → 0.2.1. All patch — every change is test-only or documentation-only.Related
ai-slop's emitter test, where it had been pinning a real bug.Generated by Claude Code