Skip to content

missing_docs: stop the drift-watch triage from silently seeing nothing - #617

Merged
rachaelrenk merged 2 commits into
mainfrom
rrenk/drift-watch-validation
Aug 24, 2026
Merged

missing_docs: stop the drift-watch triage from silently seeing nothing#617
rachaelrenk merged 2 commits into
mainfrom
rrenk/drift-watch-validation

Conversation

@rachaelrenk

@rachaelrenk rachaelrenk commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Summary

The first manual validation run of the missing_docs drift-watch skill (run) found three defects. They fail the same way: the run exits 0, reports nothing, and that is indistinguishable from "nothing shipped."

The gate and the audit both worked correctly — nine candidates, zero feature PRs, bookkeeping only. These are gaps in what reached triage in the first place.

The bugs

1. The triage baseline ignored the release marker

Two state files track releases, and they can disagree:

  • surface_snapshot.json → what was last observed
  • last_release_processed.json → what was last triaged

A bookkeeping PR that regenerates the snapshot advances the first without touching the second. #603 did exactly that, so on main today:

snapshot  changelog_last_version : 2026.08.19
marker    last_processed_version : v0.2026.08.18.02.52.stable_00

The gate fires because the marker is behind. --diff then returns an empty changelog_review because the snapshot is ahead. The primary triage input is empty, nothing is reviewed, and the release gets recorded as processed.

The baseline is now the earlier of the two markers. Against current main that moves changelog_review from 0 items to 3 — including the release's one oz_updates bullet.

I introduced this when I split the marker out of the snapshot in #586. The reasoning was sound — the snapshot is regenerated wholesale and would lose the marker — but it only accounted for the snapshot falling behind, never running ahead.

2. oz_updates were counted but never shown

check_new_release.py printed Oz updates: 1. audit_docs.py has zero references to the field, and the audit is offline by design, so it never will.

The skill names oz_updates as the preferred source for platform changes the client changelog cannot see. That instruction was not executable — the validating agent had to fetch client_version by hand. The gate now prints the bullets and includes them in --json.

The field name stays oz_updates. It is the API's, verified live in the current release payload, and product naming does not apply to a data contract.

3. A renamed changelog heading would fail silently

Section matching is a hardcoded allowlist against a user-facing heading — squarely in scope for the Automation Platform rename. Today it matches **Oz updates**; the day that heading changes, the section yields zero bullets with no error.

Added the Automation Platform variants, plus a guard that treats bullets under an unrecognized heading as an extraction failure (exit 2) rather than an empty result.

Two details that matter:

  • Bug fixes is listed as deliberately untracked, so an intentional skip cannot read as a rename.
  • The guard is scoped to entries awaiting triage. Older launch posts use prose headings (**Multithread yourself with agents**), and policing all 277 historical entries would fail every run. Caught by running it.

Also

audit_docs.py was missing the from __future__ import annotations that check_new_release.py already has. Without it the module cannot be imported on Python 3.9, so test_audit_docs.py died before running a single test on any machine using the system interpreter.

Validation

  • 5 new regression tests covering the baseline, the version normalizer, the tracked/untracked/unknown section split, and the guard's scoping.
  • test_check_new_release.py 17/17, test_suggest_reviewers.py 15/15.
  • test_audit_docs.py 16/17. The one failure is test_diff_against_committed_snapshot_is_current, which is environmental: my local warp-server checkout is three months stale, so 123 api_routes_removed and 16 slash_commands_removed are the local repos lagging the committed snapshot, not drift in it. Previously masked by the import error above.

Notes for reviewers

Draft PR #615 is closed in favor of a clean re-run after this lands. Its triage was sound — the verdicts are well-reasoned and the surface-map entries correct — but it got there by manually working around the desync, and merging it would advance the marker past the release the post-fix validation run needs to triage. Everything in it regenerates.

Remaining feedback from the validation run, not addressed here: rg is unavailable in the environment (skill examples use it), ledger rows for non-PR items have no stable key so they will be re-proposed, and "major launch" deferral could use a first-class verdict label distinct from Gate 0.

Unverified claims

None — no page content changes. Behavior was verified by running the scripts against the live client_version payload and the committed changelog, and by the regression tests above.

Co-Authored-By: Warp agent@warp.dev

Found by the first manual validation run of the drift-watch skill. All
three defects fail the same way: the run exits 0, reports nothing, and
that is indistinguishable from "nothing shipped".

1. Triage baseline ignored the release marker

Two independent state files track releases. surface_snapshot.json records
what was last *observed*; last_release_processed.json records what was
last *triaged*. A bookkeeping PR that regenerates the snapshot advances
the first without touching the second, and #603 did exactly that -- on
main today the snapshot reads 2026.08.19 while the marker reads
2026.08.18.

The gate fires (marker behind) but --diff returns an empty
changelog_review (snapshot ahead), so the primary triage input is empty
and the release gets marked processed having triaged nothing. The
baseline is now the earlier of the two markers. Against current main
that moves changelog_review from 0 items to 3.

I introduced this when I split the marker out of the snapshot. The
reasoning was sound -- the snapshot is regenerated wholesale and would
lose the marker -- but it only considered the snapshot falling behind,
not running ahead.

2. oz_updates were2. oz_updates were2. oz_updates were2. oz_updatrepo2. oz_updates were2. oz_updates were2. oz_up no2. oz_updates were2. oz_updates were2. oz_updates were2. oz_updatrepo2.
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnntfnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnh was not
executable. Texecutable. Texecutable. Texecutable. Texecutable. Texecun.
The field nThe field nThe field nThe field nThe field nThe fiel in the
currcurrcurrcue pcurrcurrcurrcue pcurrcurrcurrcue pcurrcurrcurrcue pcurrcuchangelog heading would fail silently

Section matching is a hardcoded allowlist against a user-facing heading,
so the rename would zero out that section with no error. Added the
Automation Platform variants, plus a guard that treats bullets under an
unrecounrecounrecounrecounrecounrecounrecounrecounrecxes are listed as
dededededededededededededededededededededededededededededededededededed
ttttttttttttttttttttttttttttttttttttttttttttttttttttter launch posts use
prose headings and policing all 277 entries would fail every run.

Also adds the __future__ annotations import that check_new_release.py
already had. Without it audit_docs.py cannot be imported on Python 3.9,already had. Without it audit_docs.py cannot be imported on Python 3.9,already had. Without it audit_docs.py cannot be importedver the baseline, the normalizer, the
tracked/untracked/unknown split, and thtracked/untracked/unknown split, and thtracked/untrp.dev>
@cla-bot cla-bot Bot added the cla-signed label Aug 24, 2026
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
docs Ready Ready Preview Aug 24, 2026 10:15pm

Request Review

@warp-for-oss

warp-for-oss Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

@rachaelrenk

I'm starting a first review of this pull request.

You can view the conversation on Warp.

I completed the review and no human review was requested for this pull request.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

@warp-for-oss warp-for-oss Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Overview

This PR makes the missing_docs drift-watch path safer by aligning changelog triage to the earlier of the observed and processed release markers, surfacing oz_updates from the release gate, and failing loudly on unrecognized pending changelog sections. The regression tests cover the marker baseline, version normalization, tracked/untracked section handling, and unknown-section scoping; I did not find blocking correctness, security, or spec-drift issues.

Concerns

  • Non-blocking: the new marker reader should defensively handle syntactically valid JSON with the wrong top-level shape before calling .get, matching the safe fallback described in its docstring.

Verdict

Found: 0 critical, 0 important, 1 suggestions

Approve with nits

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

Comment thread .agents/skills/missing_docs/scripts/audit_docs.py

@warp-agent-staging warp-agent-staging Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Overview

This PR improves drift-watch changelog triage by preserving the earlier observed or triaged baseline, surfacing platform-update bullets, and failing visibly for unrecognized changelog sections. The focused regression suites pass, and the audit path reports the expected pending release candidates.

Validation

  • gh pr checks 617 --required — passed (required CLA check)
  • Focused missing-docs test suites — passed: 17 audit tests (7 skipped because the sibling repos are not colocated), 17 release-check tests, and 15 reviewer-routing tests
  • audit_docs.py --warp /workspace/warp --warp-server /workspace/warp-server --diff — completed and reported the expected pending changelog entries
  • check_new_release.py --json — emitted the current oz_updates bullet
  • style_lint --changed and internal-link check — passed
  • npm run build — blocked by the pre-existing _llms-txt/support.txt stack overflow on both this PR and main under Node 24; npm run lint could not run because trunk is not installed in the sandbox

Verdict

Found: 0 critical, 1 important, 0 suggestions, 0 nits

Request changes

Comment thread .agents/skills/missing_docs/scripts/audit_docs.py
Review catch from both bots on #617. read_last_processed_release()
called .get() on whatever json.loads returned, so a marker containing
valid JSON of the wrong top-level type -- [], a bare string, a number --
raised AttributeError rather than taking the documented fallback to
None. That aborts diff-mode triage entirely, which is a worse outcome
than the desync the reader was added to fix.

Guarded with isinstance(data, dict) and a warning, matching how
check_new_release.py's read_state() already handles the same file. The
inconsistency between two readers of one file was the actual defect.

Regression test covers every bad shape: list, bare string, number, null,
truncated JSON, empty file, and an object missing the expected key, plus
the missing-marker and well-formed cases so the fallback cannot be
achieved by breaking the happy path.

Co-Authored-By: Warp <agent@warp.dev>

@warp-agent-staging warp-agent-staging Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Overview

The follow-up fixes the release-marker reader so valid JSON with a non-object top level takes the documented safe fallback instead of raising. It adds regression coverage for each malformed marker shape and retains the valid-marker path.

Validation

  • gh pr checks 617 --required — passed
  • Focused missing-docs test suites — passed: 18 audit tests (7 skipped because the sibling repos are not colocated), 17 release-check tests, and 15 reviewer-routing tests
  • audit_docs.py --warp /workspace/warp --warp-server /workspace/warp-server --diff — completed and reported the expected pending changelog entries
  • check_new_release.py --json — emitted the current oz_updates bullet
  • npm run build — fails identically on the PR and main at the existing /_llms-txt/support.txt stack overflow under Node 24; npm run lint could not run because trunk is not installed in the sandbox

Verdict

Found: 0 critical, 0 important, 0 suggestions, 0 nits

Approve

@rachaelrenk
rachaelrenk merged commit 6c1be38 into main Aug 24, 2026
8 checks passed
@rachaelrenk
rachaelrenk deleted the rrenk/drift-watch-validation branch August 24, 2026 22:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant