Skip to content

feat(tooling): inline fence annotations replace line-numbered allowlists; fix_allowlists.py retired#863

Merged
aallan merged 4 commits into
mainfrom
fix/538-inline-fence-annotations
Jul 2, 2026
Merged

feat(tooling): inline fence annotations replace line-numbered allowlists; fix_allowlists.py retired#863
aallan merged 4 commits into
mainfrom
fix/538-inline-fence-annotations

Conversation

@aallan

@aallan aallan commented Jul 2, 2026

Copy link
Copy Markdown
Owner

Summary

Burndown PR implementing #538, which structurally retires bug #606 (the maintainer-chosen resolution): documentation code-block exemptions now live as <!-- vera:skip-parse category="..." reason="..." --> HTML comments on the line before the fence (the syntax #538's body specifies — invisible in rendered markdown, per-stage skip-parse/skip-check/skip-verify directives stack), instead of line-number-keyed dicts that every edit above them invalidated. scripts/fix_allowlists.py and its pre-commit hook are deleted — the #606 bulk-shift bug class can no longer exist.

  • 176 allowlist dict entries across 8 carriers → 165 inline annotations; shared reader scripts/doc_annotations.py (scan/evaluate/strip).
  • The new stale detection immediately paid for itself: it runs the exempted stage, so an annotation on a block that now passes is a hard failure — and the migration surfaced 12 stale suppressions in shipped allowlists, including a complete, correct fn add block suppressed by exactly the scripts/fix_allowlists.py: bulk-shift heuristic misses entries on multi-edit sequences #606 mis-anchoring class, and 10 spec blocks whose features have long since landed. 11 removed outright, 1 re-annotated honestly.
  • build_site.py gains strip_annotations() so regenerated site assets are byte-identical to pre-migration (leak-tested, non-vacuous).
  • Malformed / dangling / duplicate-stage / unsupported-stage annotations are hard failures; the exemption surface can only shrink, mirroring check_e602_clean's contract.
  • Test-first throughout (20-test reader suite RED before the module existed; 4 live gate mutations each RED); full suite 5,809 passed; all six doc gates green; pre-commit green with the hook removed.
  • Docs updated in lockstep: CLAUDE.md, TESTING.md (hooks 30, scripts table), CONTRIBUTING.md, ROADMAP (Replace line-numbered allowlists with inline HTML-comment fence annotations #538 row deleted), KNOWN_ISSUES (scripts/fix_allowlists.py: bulk-shift heuristic misses entries on multi-edit sequences #606 row deleted); HISTORY one-liner deferred to the next release row per the release workflow.

Closes #538
Closes #606

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Documentation code fences now support inline <!-- vera:skip-parse/check/verify ... --> directives that intentionally control parser and checker behaviour across Markdown and HTML.
    • Published site outputs strip these annotations automatically.
  • Bug Fixes

    • Improved handling of malformed, duplicate, dangling, and unsupported skip annotations, with clearer failure behaviour.
    • Stronger “stale” detection—if a skipped block later becomes valid, it’s flagged.
  • Chores

    • Removed allowlist-based tooling and updated pre-commit hooks, docs, and validation scripts/tests to use the shared annotation gate.

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 3 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: dc4e9e17-81e8-4035-8b72-eb8ee15f8214

📥 Commits

Reviewing files that changed from the base of the PR and between 9baff24 and a17d096.

📒 Files selected for processing (2)
  • TESTING.md
  • tests/test_build_site.py
📝 Walkthrough

Walkthrough

This PR replaces line-number-keyed allowlists with inline <!-- vera:skip-* --> annotations, adds a shared scripts/doc_annotations.py gate module, rewires the doc/example checkers and tests to use it, strips annotations from generated site assets, and updates docs, hooks, and spec examples accordingly.

Changes

Inline annotation migration

Layer / File(s) Summary
Core annotation module and tests
scripts/doc_annotations.py, tests/test_doc_annotations.py
New shared module defines annotation regexes, CodeBlock/Annotation/StageOutcome types, scan_markdown/scan_html scanners, evaluate_block gate logic, unsupported_stage_annotations, and strip_annotations, with a dedicated test suite.
Checker scripts refactor
scripts/check_examples_doc.py, scripts/check_faq_examples.py, scripts/check_html_examples.py, scripts/check_readme_examples.py, scripts/check_skill_examples.py, scripts/check_spec_examples.py
Each script drops its local ALLOWLIST/extraction logic and instead uses scan_markdown/scan_html plus evaluate_block to classify blocks as ok, skipped, stale, or failed, with updated failure and guidance messages.
Site generation strips annotations
scripts/build_site.py, tests/test_build_site.py
build_skill_md and build_llms_full_txt now call strip_annotations before further processing; tests confirm generated artefacts omit vera:skip markers.
Pre-commit hook wiring
.pre-commit-config.yaml
Doc-block gate hooks' files regex now trigger on scripts/check_*.py and scripts/doc_annotations.py; the site-assets hook also includes scripts/doc_annotations.py, and the fix-allowlists hook is removed.
Docs, spec, and sample annotations
CLAUDE.md, CONTRIBUTING.md, CHANGELOG.md, KNOWN_ISSUES.md, ROADMAP.md, TESTING.md, FAQ.md, SKILL.md, spec/01-lexical-structure.mdspec/09-standard-library.md
Removes fix_allowlists.py references, updates hook/test counts, rewrites validation-pipeline notes, and inserts inline vera:skip-parse/vera:skip-check annotations throughout the reference docs and examples.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • aallan/vera#319: Prior updates touched the same doc/example gate scripts now migrated to inline annotations.
  • aallan/vera#407: This PR originally added check_examples_doc.py, whose allowlist-based flow is now replaced.
  • aallan/vera#601: Previously re-anchored ALLOWLIST line numbers in check_skill_examples.py, which this PR removes entirely.

Suggested labels: compiler, tests, spec, ci, docs

🚥 Pre-merge checks | ✅ 8
✅ Passed checks (8 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR implements #538 and #606 by adding inline annotations, removing allowlists and fix_allowlists.py, and adding shared gate handling.
Out of Scope Changes check ✅ Passed The extra documentation, test, and site-build updates support the annotation migration and do not appear unrelated to the linked objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Changelog Covers Public-Surface Changes ✅ Passed CHANGELOG.md explicitly covers the spec-level API corrections (parse_int, apply_fn, example fixes) and the spec-wide inline annotation migration with stale-suppression semantics.
Spec And Implementation Move Together ✅ Passed No vera/ compiler files changed; spec edits are annotations/examples, and apply_fn/parse_int already exist in the implementation.
Diagnostics Carry An Error Code ✅ Passed No changed Diagnostic-producing code in the PR diff; the new annotation gates only emit plain text, so there is no missing E/W### code to flag.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarises the core migration from line-numbered allowlists to inline annotations and the removal of fix_allowlists.py.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/538-inline-fence-annotations

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

@codecov

codecov Bot commented Jul 2, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.00%. Comparing base (18cce45) to head (a17d096).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #863   +/-   ##
=======================================
  Coverage   92.00%   92.00%           
=======================================
  Files          95       95           
  Lines       28809    28809           
  Branches      332      332           
=======================================
  Hits        26506    26506           
  Misses       2295     2295           
  Partials        8        8           
Flag Coverage Δ
javascript 65.23% <ø> (ø)
python 94.95% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@aallan

aallan commented Jul 2, 2026

Copy link
Copy Markdown
Owner Author

Adversarial review complete (M-tier, two independent skeptics): CLEAN, zero findings.

Skeptic 1 (gate teeth + coverage conservation): the 176 = 165 + 11(+1 re-annotated) accounting proven at content level, not counts; all eight mutation classes fail loudly (stale, removed, malformed incl. the skip-prase typo path — the exact silent-rot class #606 represented — dangling, duplicate, unsupported-stage, non-vera target); regenerated site assets byte-identical; the original #606 bulk-shift repro (two edits at different positions, +10 line shift) is now a non-event with identical gate output and nothing to renumber.

Skeptic 2 (blast radius): each of the 12 formerly-suppressed blocks individually re-run through the real gate runners — the 11 removals genuinely pass their stages now (including the complete, correct fn add block that the #606 mis-anchoring class had wrongly suppressed in shipped main), and the one re-annotation is load-bearing (differential: removing it fails the gate with the exact documented error); all 165 placements mechanically verified outside fences; zero vera:skip leaks into docs/; zero surviving instructions referencing the deleted script in CI, CLAUDE.md, or CONTRIBUTING.md; full pre-commit green with the hook gone.

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
spec/07-effects.md (2)

205-217: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Align this example with parse_int.

parse_int is documented in spec/09-standard-library.md as a pure Result<Int, String> function, not an Exn<String> thrower. As written, the example teaches the wrong effect model.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@spec/07-effects.md` around lines 205 - 217, The example in safe_parse is
using the wrong effect model for parse_int, which is documented as returning
Result<Int, String> rather than throwing Exn<String>. Update the snippet to
match the standard library behavior by replacing the handler/throw-based flow
with the actual Result-based parsing pattern, and keep the example centered on
safe_parse and parse_int so the effects documentation teaches the correct API
semantics.

254-286: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use the supported higher-order call form in both snippets.

Both examples still invoke a function-valued slot directly (@Fn.0(...)). That makes the parse skip cover the wrong failure mode and conflicts with the higher-order call rule.

Suggested fixes
-    Some(`@A`) -> Some(`@Fn.0`(`@A.0`)),
+    Some(`@A`) -> Some(apply_fn(`@Fn.0`, `@A.0`)),
-  let `@A` = `@Fn.0`(());
+  let `@A` = apply_fn(`@Fn.0`, ());
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@spec/07-effects.md` around lines 254 - 286, Both examples are using the wrong
higher-order invocation form by calling the function-valued field directly with
`@Fn.0`(...), which does not match the supported syntax. Update option_map and
with_logging to use the proper higher-order call form for the function parameter
named Fn, so the snippets demonstrate the intended call rule rather than a
parse-skipped direct field call. Keep the effect-variable behavior unchanged
while adjusting only the function invocation syntax in these two examples.
spec/05-functions.md (1)

327-339: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use apply_fn for the higher-order call.

@Fn.0(@A.0) directly applies a function-valued slot, which conflicts with the stored-function invocation rule documented earlier. If direct calls on function values are now legal, the docs need to say so; otherwise this example should use apply_fn(...).

Suggested fix
-    Some(`@A`) -> Some(`@Fn.0`(`@A.0`)),
+    Some(`@A`) -> Some(apply_fn(`@Fn.0`, `@A.0`)),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@spec/05-functions.md` around lines 327 - 339, The option_map example is using
a direct function-value call via `@Fn.0`(`@A.0`), which conflicts with the
documented invocation style for stored functions. Update the example in
option_map to use apply_fn for the higher-order call, and keep the surrounding
fn/Some/None pattern unchanged so the snippet matches the invocation rule
described earlier.
spec/09-standard-library.md (1)

1749-1767: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Move or delete this stray annotation.

The reason mentions string_chars/lines/words, but the fence it precedes is array_sort_by, and the matching string-utility fence already appears later in the file. That mislabels the suppression target.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@spec/09-standard-library.md` around lines 1749 - 1767, The stray
vera:skip-parse annotation is attached to the wrong fenced snippet, so move or
remove it from the array_sort_by example and place it with the string utility
fragment it actually refers to. Update the surrounding comment/annotation near
array_sort_by in the standard library docs so the suppression target matches the
later string_chars/lines/words section and the parser skip remains correctly
scoped.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/check_examples_doc.py`:
- Around line 8-27: The parse-only gate logic in main() is duplicated across
check_examples_doc.py, check_faq_examples.py, and check_readme_examples.py.
Extract the shared scan/classify/count/exit flow into a reusable helper in
doc_annotations.py, such as run_parse_only_gate, and have each script call it
with only its target path and label differences. Keep the existing
evaluate_block, scan_markdown, and unsupported_stage_annotations behavior
unchanged while removing the triplicated reporting logic from the individual
scripts.

In `@scripts/doc_annotations.py`:
- Around line 149-162: Handle unterminated blocks as validation failures in the
Markdown and HTML parsing flow: in the code that builds CodeBlock entries and
the `<pre>` handling logic, detect when the closing fence/tag is missing before
EOF and surface it as a gate problem instead of appending or silently ignoring
the block. Update the parsing paths around the CodeBlock construction and the
`<pre>` branch to report an explicit error even when pending annotations are
present, so malformed docs cannot pass unnoticed.

---

Outside diff comments:
In `@spec/05-functions.md`:
- Around line 327-339: The option_map example is using a direct function-value
call via `@Fn.0`(`@A.0`), which conflicts with the documented invocation style for
stored functions. Update the example in option_map to use apply_fn for the
higher-order call, and keep the surrounding fn/Some/None pattern unchanged so
the snippet matches the invocation rule described earlier.

In `@spec/07-effects.md`:
- Around line 205-217: The example in safe_parse is using the wrong effect model
for parse_int, which is documented as returning Result<Int, String> rather than
throwing Exn<String>. Update the snippet to match the standard library behavior
by replacing the handler/throw-based flow with the actual Result-based parsing
pattern, and keep the example centered on safe_parse and parse_int so the
effects documentation teaches the correct API semantics.
- Around line 254-286: Both examples are using the wrong higher-order invocation
form by calling the function-valued field directly with `@Fn.0`(...), which does
not match the supported syntax. Update option_map and with_logging to use the
proper higher-order call form for the function parameter named Fn, so the
snippets demonstrate the intended call rule rather than a parse-skipped direct
field call. Keep the effect-variable behavior unchanged while adjusting only the
function invocation syntax in these two examples.

In `@spec/09-standard-library.md`:
- Around line 1749-1767: The stray vera:skip-parse annotation is attached to the
wrong fenced snippet, so move or remove it from the array_sort_by example and
place it with the string utility fragment it actually refers to. Update the
surrounding comment/annotation near array_sort_by in the standard library docs
so the suppression target matches the later string_chars/lines/words section and
the parser skip remains correctly scoped.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 83f0ea5d-1444-4dd4-a11d-c768b1f54ae0

📥 Commits

Reviewing files that changed from the base of the PR and between 1215df8 and fdc1030.

📒 Files selected for processing (30)
  • .pre-commit-config.yaml
  • CHANGELOG.md
  • CLAUDE.md
  • CONTRIBUTING.md
  • FAQ.md
  • KNOWN_ISSUES.md
  • ROADMAP.md
  • SKILL.md
  • TESTING.md
  • scripts/build_site.py
  • scripts/check_examples_doc.py
  • scripts/check_faq_examples.py
  • scripts/check_html_examples.py
  • scripts/check_readme_examples.py
  • scripts/check_skill_examples.py
  • scripts/check_spec_examples.py
  • scripts/doc_annotations.py
  • scripts/fix_allowlists.py
  • spec/01-lexical-structure.md
  • spec/02-types.md
  • spec/03-slot-references.md
  • spec/04-expressions.md
  • spec/05-functions.md
  • spec/06-contracts.md
  • spec/07-effects.md
  • spec/09-standard-library.md
  • tests/test_build_site.py
  • tests/test_doc_annotations.py
  • tests/test_html.py
  • tests/test_readme.py
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • aallan/vera-bench (manual)
💤 Files with no reviewable changes (3)
  • scripts/fix_allowlists.py
  • CLAUDE.md
  • KNOWN_ISSUES.md

Comment thread scripts/check_examples_doc.py Outdated
Comment thread scripts/doc_annotations.py
@aallan

aallan commented Jul 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai All six round-1 findings addressed in 234ba09 — the two inline threads have direct replies; the four outside-diff findings (no threads) are resolved as follows:

spec/07-effects.md §7.5 (safe_parse taught parse_int as an Exn<String> thrower) — rewritten: parse_int is the pure Result<Int, String> built-in, so the example now wraps it in a parse_or_throw helper that converts Err into throw, with the effect Exn<E> declaration included so the block is self-contained. The rewritten block passes the full parse+check+verify pipeline (4 Tier-1 obligations), so its INCOMPLETE skip-check annotation is removed — spec check-stage annotations drop 7 → 6, exactly the shrink the stale-detection design is for.

spec/07-effects.md §7.6/§7.6.1 and spec/05-functions.md §5.9.1 (direct @Fn.0(...) application)option_map and with_logging now apply the stored function value with apply_fn(...) per the §11.10.5 invocation rule (checker-typed since #854), with a cross-reference added in the prose. The blocks remain FRAGMENT-annotated for their inline fn-type parameters — the gate re-parses annotated blocks, and its stale detection stayed quiet, confirming the annotations are still honest.

spec/09-standard-library.md (mis-anchored suppression reason) — the annotation on the array_sort_by signature fence carried a string_chars/lines/words description, a #606-era allowlist mis-anchoring carried through the migration verbatim; the fence genuinely needs its suppression (bodyless signature), so the reason now names array_sort_by. The real string-utilities fence further down already had its own correct annotation.

Also in 234ba09: the unterminated-fence/<pre> hard failures and the run_parse_only_gate extraction from the inline threads, a CHANGELOG ### Fixed entry, and refreshed TESTING.md pipeline counts (type-check 86 pass / 6 annotated, verify 85 / 1). Gates: full pytest 5812 passed, six doc gates green, doc counts consistent, site assets byte-identical.

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
git log --oneline -5
git show --stat 234ba09 2>/dev/null | head -50
echo "---parse_int check---"
git show 234ba09 -- spec/07-effects.md 2>/dev/null | head -150
echo "---stdlib annotation---"
git show 234ba09 -- spec/09-standard-library.md 2>/dev/null | head -80
echo "---changelog---"
git show 234ba09 -- CHANGELOG.md 2>/dev/null

Length of output: 2360


@aallan Thanks for the detailed writeup. I attempted to pull the branch to independently re-verify commit 234ba09 (checking the parse_int/Exn<String> rewrite, the apply_fn conversions, the array_sort_by annotation fix, and the stale-count shrink), but the sandbox clone failed with a repository authentication error, so I can't re-run the gates myself in this session.

Based on your description, the fixes look sound from a correctness standpoint:

  • Making parse_int a pure Result<Int, String> builtin and pushing the throw conversion into an explicit parse_or_throw wrapper is the right way to keep the effect signature honest — an Exn<String>-throwing parse_int would have been a real type-safety lie in the spec. Good that removing the now-unnecessary INCOMPLETE skip-check annotation was verified as a genuine 7→6 shrink rather than just deleted.
  • Routing option_map/with_logging through apply_fn(...) instead of @Fn.0(...) direct field access matches the checker's typing rule from #854 — direct field application on a closure record would have been unsound outside the invocation path the checker actually type-checks.
  • Renaming the array_sort_by annotation reason (rather than dropping the suppression) is correct, since it's genuinely a bodyless signature fragment and needed the skip; fixing the copy-pasted string_chars/lines/words reason text closes the mis-anchoring smell without weakening the gate.

If you'd like, I can re-run a fresh full review pass once I have working repo access, to independently confirm the stale-annotation counts and byte-identical site assets rather than taking the summary at face value.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@aallan

aallan commented Jul 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

…ed allowlists (#538, retires #606)

Squash of the migration + the CodeRabbit round (scanner hardening,
run_parse_only_gate extraction, spec example corrections).

Co-Authored-By: Claude <[email protected]>
@aallan aallan force-pushed the fix/538-inline-fence-annotations branch from 234ba09 to ff94875 Compare July 2, 2026 22:48
…notation gates

Skip-changelog: guard-style polish flagged by the ruff -S sweep; no behavior change.

Co-Authored-By: Claude <[email protected]>
@aallan

aallan commented Jul 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_build_site.py`:
- Around line 293-296: The test
`test_llms_full_txt_strips_vera_skip_annotations` can pass vacuously because it
only checks the compiled `build_llms_full_txt("0.0.0")` output and never
verifies the source content actually contains `vera:skip-` first. Add the same
kind of precondition guard used by the sibling test above by asserting the
relevant inlined source (`SKILL.md`/`FAQ.md`) includes a `vera:skip-` annotation
before checking the built output, so the test fails if `build_llms_full_txt`
stops inlining or stripping annotations.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 57167bac-8d36-4c83-8039-b59fd635ad60

📥 Commits

Reviewing files that changed from the base of the PR and between fdc1030 and 9baff24.

📒 Files selected for processing (30)
  • .pre-commit-config.yaml
  • CHANGELOG.md
  • CLAUDE.md
  • CONTRIBUTING.md
  • FAQ.md
  • KNOWN_ISSUES.md
  • ROADMAP.md
  • SKILL.md
  • TESTING.md
  • scripts/build_site.py
  • scripts/check_examples_doc.py
  • scripts/check_faq_examples.py
  • scripts/check_html_examples.py
  • scripts/check_readme_examples.py
  • scripts/check_skill_examples.py
  • scripts/check_spec_examples.py
  • scripts/doc_annotations.py
  • scripts/fix_allowlists.py
  • spec/01-lexical-structure.md
  • spec/02-types.md
  • spec/03-slot-references.md
  • spec/04-expressions.md
  • spec/05-functions.md
  • spec/06-contracts.md
  • spec/07-effects.md
  • spec/09-standard-library.md
  • tests/test_build_site.py
  • tests/test_doc_annotations.py
  • tests/test_html.py
  • tests/test_readme.py
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • aallan/vera-bench (manual)
💤 Files with no reviewable changes (2)
  • CLAUDE.md
  • scripts/fix_allowlists.py

Comment thread tests/test_build_site.py
… sibling

Skip-changelog: test-precondition polish from CodeRabbit round 2.

Co-Authored-By: Claude <[email protected]>
@aallan

aallan commented Jul 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

…tion

Skip-changelog: count bookkeeping for the prior review commit.

Co-Authored-By: Claude <[email protected]>
@aallan

aallan commented Jul 2, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@aallan aallan merged commit 418899c into main Jul 2, 2026
26 checks passed
@aallan aallan deleted the fix/538-inline-fence-annotations branch July 2, 2026 23:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant