Skip to content

audit: scope is a declared input with three literals; the bendless rule is never diff-only - #67

Merged
thedavidmeister merged 4 commits into
mainfrom
2026-07-30-issue-66-declared-scope
Jul 30, 2026
Merged

audit: scope is a declared input with three literals; the bendless rule is never diff-only#67
thedavidmeister merged 4 commits into
mainfrom
2026-07-30-issue-66-declared-scope

Conversation

@thedavidmeister

@thedavidmeister thedavidmeister commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Closes #66

The contradiction, both passages as shipped

skills/audit/SKILL.md states, as one of the two rules that never bend:

  • Whole-repo snapshot, never a diff. Every source file is in scope regardless of when it last changed. Do not scope by recent changes / PR diff.

Its run-stamp section then treats scoped runs as an established fact, with a vocabulary:

scope is the accuracy discriminator and MUST be exactly the string whole-repo for a full audit — nothing else means whole-repo. This skill is also invoked scoped (the vetter and producer run it against only a PR's changed files); a scoped run MUST NOT append a whole-repo line. It either appends no line, or a line whose scope is an explicitly non-whole value — pr:<number> (a PR-scoped review) or paths:<comma-separated globs> (a path-scoped review).

Both are in the shipped file, and whichever section the reader is holding wins. A third restatement sat in ## Principles ("Whole-repo snapshot, every file, every language — never scoped by diff or recency"), plus the whole-repo claims in the frontmatter description, the H1 and the lead sentence — so the always-whole-repo side had five voices and the scoped side one.

Measured cost: asked to review rainlanguage/rain.deploy#21, a reader holding SKILL.md produced a whole-repo audit — twelve findings, five bearing on the PR, seven in pre-existing code the diff never touches — and conveyed the scope as free text in an args string, which nothing could validate. The reviewer was following the skill's rule as written.

The three-value contract

New section ## Scope: a declared input, at the front of the skill, ahead of everything that consumes it. Scope is an input the caller declares, with exactly three literals and no others — the same three that already existed in the stamp section, promoted rather than re-invented:

declared scope unit of review
whole-repo every first-party file the discovery globs enumerate, regardless of when it last changed
pr:<number> the diff PLUS its ramifications
paths:<comma-separated globs> every first-party file matching the globs, plus their ramifications

One definition, referenced everywhere, restated nowhere. The run-stamp section now opens by pointing at it and explicitly adds no vocabulary of its own; ## Shared rules file discovery, the fan-out Survey step, the dimensions header, ## Findings → issues, ## Triage and ## Principles all reference it too.

Undeclared scope resolves by a fixed rule rather than by the request's tone — PR identified → pr:<n>; files/globs named → paths:; neither → whole-repo — and the resolved scope is stated as the first line of output before any source is read. A request whose subject is a pull request never resolves to whole-repo (a caller may still explicitly declare it; what is forbidden is reaching it by default). That single substitution is the measured failure above.

The never-diff-only recast

The bendless rule is now:

  • Never diff-only. A review is never bounded by the changed lines, at any scope. […] The scope bounds what is REPORTED, never what is READ. Recency is not a scope — there is no "only what changed lately" mode.

"Never diff-only" is the invariant actually being protected, and unlike "always whole-repo" it holds at all three scopes. The scope bounds what is reported, never what is read is the load-bearing sentence every per-scope rule below derives from: a scoped run reads outside its scope constantly and by design, and that is not scope creep — reporting outside it is.

Ramifications are defined once, four mandatory limbs, admitted by the inclusion test "would understanding this file change the ruling on THIS diff?":

  1. Callees — everything the changed lines invoke, following into dependency repos (soldeer lib/, crates, node_modules).
  2. Callers — every site relying on the behaviour the change alters.
  3. Siblings — other implementations sharing the changed invariant.
  4. Claims — every current-behaviour claim in the PR body, its commits, and the linked issue, verified against real source.

Both failure modes are prohibited explicitly, each with its own citation:

  • Never the diff alonerainlanguage/raindex#2778's claim that a signer<256> operand silently resolves to row 0 was falsified only by reading the callee, which reverts. A diff-only lens returns clean on that PR structurally: the evidence is not in the diff.
  • Never a whole-repo sweep either — under pr:<n>, a finding in code the change neither alters, nor calls, nor is called by, nor shares an invariant with, nor makes a claim about, is out of scope for the ruling.
  • paths: is not a place to hide a diff — globs that are exactly a PR's changed-file list are a diff-only review wearing a path scope; declare pr:<n> and take the ramifications.

Per-dimension degradation

Extent narrows; rigor never does — a dimension saying "enumerate, do not sample" still enumerates exhaustively over the narrower set, and no dimension is silently skipped or silently widened. Every dimension was read in full before its rule was written:

Output per scope: only whole-repo files audit-labelled issues by default — the audit label is the repository's outstanding-audit ledger that rain-org-health counts, and a review of one change is not a fact about the repository's audit surface. A scoped run returns findings to its caller; if the caller explicitly asks for issues, each body names the declared scope.

The stamp derives from the declaration

## Run stamp & scope no longer restates the vocabulary. It records the scope the run declared, copied verbatim — never re-derived at write time from which mode the reviewer recalls being in — and a run whose declared scope was anything else must not write whole-repo, whatever it read along the way (ramifications widen the reading, never the declared scope). Consumer semantics are unchanged: recency comes only from the last scope == "whole-repo" line.

One either/or was made determinate, because it was an unforced instance of the same defect class: the old text let a scoped run "either append no line, or a line whose scope is…". A scoped run's default is now to write nothing under .audit/ (audit recency is a fact about the repository), writing a scoped line only when its caller asks — never scope.json, never a whole-repo line.

Dependency note for issue-pr-cron

Two issues are being built in parallel against these exact three literals, and neither should need to re-spell them:

whole-repo / pr:<number> / paths:<comma-separated globs> are the whole vocabulary, and the skill now states that they are what a caller passes.

Versions

plugin.json and marketplace.json 0.20.0 → 0.22.0 (lockstep, as version-hygiene requires), leaving 0.21.0 to the open #65 which touches the same file. The SKILL.md frontmatter version: had drifted to 0.19.0 (neither hygiene job gates it — a known gap, not fixed here) and is realigned to 0.22.0 with the other two.

QA

  • Discriminating tests: n/a — this repo ships no test suite over SKILL.md. git ls-files is six files (the skill, README.md, install.sh, the two .claude-plugin manifests, one workflow); there are no structure or ordering assertions to extend and no prose linter. The only automated gate is .github/workflows/version-hygiene.yaml, and both jobs were replicated by hand with real jq 1.8.2 against origin/main before pushing: job 1 (plugin.json 0.22.0 == marketplace.json 0.22.0) PASS; job 2 (skills/ changed ⇒ plugin.json bumped, base 0.20.0 → head 0.22.0) PASS. Both manifests re-validated as parseable JSON (jq -e .).
  • Mutations applied: n/a — the diff is prose in a skill document plus three version-string bumps; there is no executable branch to mutate. The analogue performed instead was falsification of every load-bearing claim against the shipped source, since a wrong claim would invalidate the rule built on it: (a) both quoted passages were located and transcribed from origin/main's SKILL.md (lines 23 and 216 pre-change), not from the issue's paraphrase; (b) a full grep -in 'whole.repo|diff|scope' sweep found five always-whole-repo assertions, not the one the issue names — frontmatter description, H1, the lead sentence, the bendless rule, and the ## Principles bullet — all five recast, because fixing only the quoted rule would have left three surviving voices contradicting the new contract; (c) rainlanguage/raindex#2778 confirmed to exist and to be titled "fix: mask signer row operand to low byte", consistent with the callee-reverts falsification; (d) all nine hazard categories, all twelve dimension-4 checks and all seven dimensions read line by line before the degradation rules were written, and each check classified per-file vs repo-global from its own text (feat: marketplace + consolidate to one ultracode-native audit skill #1, audit: flag decoding a rainlang stack item into a Rain-Float in a NON-numeric context as invalid #5, Add a stale-soldeer-dependency check (flag deps behind the latest published revision) #10, ERC-165 checks: prefer OZ ERC165+super over raw IERC165, plus empty/vacuous impls, half-advertised families, and test coverage #11 global; audit: add explicit hazard category for timestamp/equality boundary conditions #4 change-scoped) so no rule contradicts a dimension's own definition; (e) both sibling issues (issue-pr-cron #154, #155) read in full to confirm they are being built against these three literals and not a fourth spelling.
  • Oracle: issue Scope is a bendless prohibition in the principles and a first-class concept in the stamp rules, so a PR review runs whole-repo #66's own specification of the contract (three literals, never-diff-only recast, per-scope unit, dimension-6 and dimension-0 degradation pinned by the issue) plus, independently of it, the shipped SKILL.md at origin/main read as source of truth for both quoted passages, for every dimension's own definition, and for the residual whole-repo assertions the issue does not enumerate. The raindex#2778 and rain.deploy#21 facts were checked against GitHub, not accepted from the brief.
  • Category check: issue asks (a) scope accepted as a declared input, (b) exactly the three existing literals with no new spellings, (c) the vocabulary promoted to the front with ONE definition the stamp section references rather than restates, (d) the bendless rule recast from always-whole-repo to never-diff-only, (e) per-scope unit of review defined, pr:<n> being diff PLUS ramifications with the four limbs, the would-it-change-the-ruling inclusion test, and explicit prohibition of BOTH diff-alone and a whole-repo sweep, (f) raindex#2778 cited as the canonical diff-only miss, (g) which dimensions degrade under pr:<n> and how, with dimension 6 running against the categories the diff touches (neither skipped nor widened) and dimension 0 only where the diff contradicts a process claim, (h) the rest worked out per dimension with no ambiguity left, (i) the stamp deriving from the declared scope, (j) versions at 0.22.0 across all three declarations. Covered (a)–(j). The issue's own "Check" section holds clause by clause: a reader holding only SKILL.md and asked to review a PR reaches diff-plus-ramifications from the skill itself (## Scope resolution rule + the ramification limbs, no nr.md required); the bendless rule and the stamp section now give the same answer about whether a scoped run is legal, because the second defers to the first; scope cannot be conveyed as unvalidated free text (three literals, nothing else legal); and the stamp records the scope the run declared. A final dimension-0 pass over the new text closed five self-inflicted ambiguities — the diff-worded inclusion test and limbs under paths:, "resolves" vs "declares" whole-repo on a PR request, the disclosure gate's "public issues" vs a public PR comment, hazard-category non-exhaustiveness under a scoped run, and dimension 4's own header still asserting whole-repo — plus the pre-existing either/or in the stamp rules for scoped runs.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added declared-scope auditing for whole repositories, pull requests, or selected paths.
    • Audits now account for relevant code ramifications while clearly limiting reported findings to the declared scope.
    • Improved audit records and artifact handling for scoped and whole-repository runs.
  • Security

    • Strengthened disclosure rules so critical and high-severity findings are withheld from public filing, while lower-severity findings may be filed automatically.
  • Chores

    • Updated the plugin version from 0.21.0 to 0.22.0.

claude added 2 commits July 30, 2026 10:57
SKILL.md carried two shipped answers to "is a scoped run legal". The
never-bends rule said whole-repo always; the run-stamp section modelled
pr:<number> and paths:<globs> as established fact. Whichever section the
reader held won: asked to review rain.deploy#21 a reader produced a
whole-repo audit, twelve findings, seven in code the diff never touches.

Scope is now a declared input with exactly three literals, defined once in
a new "Scope: a declared input" section that every other section
references and none restates. The bendless rule is recast from "always
whole-repo" to "never diff-only" — the invariant that actually holds at
every scope — with the diff-plus-ramifications unit, the four ramification
limbs, the would-it-change-the-ruling inclusion test, and prohibitions on
both the diff alone (raindex#2778) and a whole-repo sweep under a PR
scope. Per-dimension degradation is stated for all seven dimensions plus
triage. The stamp now copies the declared scope verbatim rather than
re-deriving it from the reviewer's recollection.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…hs: and disclosure

Dimension-0 pass over the new text: the inclusion test and the four
ramification limbs are worded for a diff, so paths: gets an explicit
substitution rule; "resolves" vs "declares" whole-repo on a PR request is
spelled out; the security-disclosure gate is generalised at its definition
site to cover any public surface (a public PR comment, not only an issue)
so Output per scope references it instead of restating it; hazard cat.
non-exhaustiveness is preserved under a scoped run; dimension 4's header
no longer asserts whole-repo; triage carries a pointer.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@thedavidmeister thedavidmeister self-assigned this Jul 30, 2026
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

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

Next review available in: 50 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 7469d8b4-301e-490c-a977-d523de1a17b5

📥 Commits

Reviewing files that changed from the base of the PR and between 93e84f2 and e16cc44.

📒 Files selected for processing (1)
  • skills/audit/SKILL.md

Walkthrough

The plugin version is bumped to 0.22.0. Audit instructions now define declared-scope execution, non-diff-only review semantics, scope-aware discovery, disclosure rules, and distinct whole-repo versus scoped run artifacts.

Changes

Audit scope and release metadata

Layer / File(s) Summary
Declared scope and audit execution
skills/audit/SKILL.md
Defines whole-repo, pr:<n>, and paths:<globs> scopes, including ramifications, filtered discovery, orchestrator propagation, and per-dimension filtering.
Findings, disclosure, and run records
skills/audit/SKILL.md
Clarifies issue filing, security disclosure thresholds, scope stamping, manifest semantics, and triage of filed issues.
Plugin version metadata
.claude-plugin/marketplace.json, .claude-plugin/plugin.json
Updates both plugin manifest versions from 0.21.0 to 0.22.0.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant Orchestrator
  participant Discovery
  participant AuditAgents
  participant IssueTracker
  Caller->>Orchestrator: provide declared scope
  Orchestrator->>Discovery: resolve scope and discover files
  Discovery-->>Orchestrator: candidates and ramifications
  Orchestrator->>AuditAgents: pass scope and audit context
  AuditAgents-->>Orchestrator: scope-filtered findings
  Orchestrator->>IssueTracker: file eligible whole-repo findings
Loading

Possibly related PRs

Suggested reviewers: claude

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is specific and matches the core change: declared scope literals and the switch to a never-diff-only audit rule.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 2026-07-30-issue-66-declared-scope

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.

@thedavidmeister

Copy link
Copy Markdown
Contributor Author

QA evidence, transcribed

1. version-hygiene replicated by hand with real jq

The repo has no flake, no pre-commit and no test over SKILL.md, so .github/workflows/version-hygiene.yaml is the only automated gate. jq is not on PATH in this environment; both jobs were run with the real binary from the nix store (jq-1.8.2), not a substitute.

Job 1 — plugin.json and marketplace.json versions agree:

$ plugin=$(jq -r '.version' .claude-plugin/plugin.json)
$ market=$(jq -r '.plugins[0].version' .claude-plugin/marketplace.json)
PASS versions agree: 0.22.0

Job 2 — a change under skills/ must bump plugin.json version (BASE resolved as origin/main, exactly as the workflow resolves github.event.pull_request.base.sha):

$ git diff --quiet "$BASE" -- skills/          # non-zero: skills/ DID change
$ git show "$BASE:.claude-plugin/plugin.json" | jq -r '.version'
0.20.0
$ jq -r '.version' .claude-plugin/plugin.json
0.22.0
PASS skills/ changed and version bumped: 0.20.0 -> 0.22.0

JSON validity (a hygiene job that cannot parse the manifest fails on the parse, not the comparison):

$ jq -e . .claude-plugin/plugin.json > /dev/null      # plugin.json valid JSON
$ jq -e . .claude-plugin/marketplace.json > /dev/null # marketplace.json valid JSON

Frontmatter version:, which neither job gates — set by hand, since job 2 only reads plugin.json:

$ grep -n '^version:' skills/audit/SKILL.md
4:version: 0.22.0

All three declarations therefore read 0.22.0. Note the frontmatter had drifted to 0.19.0 while plugin.json said 0.20.0; that gap is real and unfixed at the CI level (out of scope here, and #65 realigns the same field to its own version).

2. Both quoted passages located in the shipped file, not paraphrased

Read from origin/main, skills/audit/SKILL.md:

  • line 23 — the second of the two rules that never bend: "Whole-repo snapshot, never a diff. Every source file is in scope regardless of when it last changed. Do not scope by recent changes / PR diff."
  • line 216 — inside the .audit/runs.jsonl bullet of ## Run stamp & scope: "…This skill is also invoked scoped (the vetter and producer run it against only a PR's changed files); a scoped run MUST NOT append a whole-repo line. It either appends no line, or a line whose scope is an explicitly non-whole value — pr:<number> (a PR-scoped review) or paths:<comma-separated globs> (a path-scoped review)."

3. The always-whole-repo side had five voices, not one

grep -in 'whole.repo|whole codebase|diff|scope' over the shipped file surfaced every assertion, and four beyond the quoted rule needed recasting or they would have kept contradicting the new contract:

# location on main assertion
1 frontmatter description "Reviews EVERY source file across all languages as a whole-repo snapshot (not a diff)"
2 H1, line 7 "# Codebase Audit (whole-repo, multi-dimension)"
3 lead sentence, line 9 "seven review dimensions over the whole codebase"
4 bendless rule, line 23 the quoted passage
5 ## Principles, line 243 "Whole-repo snapshot, every file, every language — never scoped by diff or recency."

Plus two softer ones now scope-aware: ## Shared rules file discovery (globs with no scope filter) and dimension 4's header ("across the whole repo"). Fixing only #4 would have left a reader landing on #1, #2, #3 or #5 with the old rule intact — the same defect, relocated.

4. External facts checked against GitHub, not accepted from the brief

  • rainlanguage/raindex#2778 exists and is titled "fix: mask signer row operand to low byte" — consistent with the cited falsification (the claim was about a signer<256> operand's silent resolution; the callee reverts).
  • rainlanguage/claude-audit-skills#65 is OPEN and unmerged at the time of pushing, and origin/main is still b94e7eb. So no git merge origin/main was needed; 0.21.0 is left untouched for audit: named returns must be locally provable; org default outranks file-local style #65 and this PR takes 0.22.0. If audit: named returns must be locally provable; org default outranks file-local style #65 lands first this branch takes a merge (never a rebase) and keeps 0.22.0.
  • issue-pr-cron #154 and #155 both read in full: #154 passes pr:<n> from /nr built off pr_checkout/pr_context, #155 records the scope on the lens ledger and gates record_gate on it. Both name the same three literals, and #155 independently cites the same raindex#2778 miss. No fourth spelling appears in either.

5. Every dimension read in full before its degradation rule was written

The brief's own warning — a rule contradicting a dimension's own definition is worse than no rule — drove the classification. Each dimension-4 check was classified from its own text rather than assumed:

Dimension 6's nine categories were each mapped to the diff-shape that triggers it, checked one by one against the category text. Two dimensions resisted a clean "degrades" story and are stated as such rather than left ambiguous: 5 (correctness/intent) does not degrade in kind — it gains a limb (Claims) that whole-repo has no analogue for — and triage is a whole-repo stage in practice because it loops over filed issues.

6. Dimension-0 pass over my own new text

Reading the finished file as its own process review, six ambiguities two sessions could split on were closed — five of them introduced by this change, one pre-existing:

  1. The inclusion test and all four ramification limbs are worded for a diff; under paths: there is none. Added an explicit substitution rule (in-scope files for changed lines; the Claims limb applies to the prompting request/issue and the files' own claims, and is empty rather than skipped where nothing claims anything).
  2. "A request whose subject is a PR never resolves to whole-repo" could be read as forbidding an explicitly declared whole-repo on a PR. Split resolves from declares.
  3. "Report only findings about the code in scope" collided with "never withhold a CRITICAL/HIGH". The exception is now named at the point of the general rule.
  4. The disclosure gate said "do NOT auto-file them as public issues" — a scoped run's natural output is a public PR comment, equally public. Generalised at the gate's own definition site so ## Output per scope references it instead of restating it.
  5. Hazard categories are explicitly non-exhaustive; "do not widen to all nine" could read as closing the set. Non-exhaustiveness restated as surviving at every scope.
  6. Pre-existing: the stamp rules let a scoped run "either append no line, or a line whose scope is…" — an unforced either/or of exactly this defect class. Now determinate: a scoped run's default is to write nothing under .audit/, and fileCount on a scoped line counts reviewed files, not ramification-only reads.

7. What is NOT verified

No behavioural verification is possible here: the deliverable is instruction prose, and its only real test is a future reader reaching the right scope. Nothing in this repo can assert that, and no such harness was invented for one file. The structural check that does exist (version-hygiene) was run above.

@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: 4

🤖 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 `@skills/audit/SKILL.md`:
- Around line 174-177: Update the “Loop until dry” requirement in the audit
orchestrator instructions to enforce deterministic convergence: define a stable
finding key for deduplication, impose a maximum round count or workflow budget,
and emit an explicit incomplete result when the limit is reached before no new
findings appear.
- Around line 78-83: Update the audit rules for test coverage, documentation,
correctness/intent, triage, and bare-import checks to explicitly distinguish
pr:<n> runs from paths: runs. Keep PR runs scoped to changed behavior, public
items, claims, and filed issues; require paths: runs to enumerate the applicable
behavior, public items, claims, imports, and triage inputs in the selected files
even when no diff exists.
- Around line 31-37: Add machine-checked scope handling at the audit worker
boundary: validate scope against the three declared literals and extend finding
records with scope, target-versus-ramification classification, and out-of-scope
status. In the orchestrator’s pre-synthesis/output path, filter findings so only
primary in-scope findings and explicitly permitted critical/high ramification
findings remain; do not rely on prompt instructions alone.
- Around line 294-295: Update the whole-repo scope manifest specification so
`.audit/scope.json` accounts for every input audited by a whole-repo run,
including process documents, documentation, shell, and CI files, rather than
only source-tree files. Align its snapshot or hash, fileCount, and staleness
checks with that complete audited set while preserving the rule that scoped runs
never modify the manifest.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: db17b0bc-d07b-4aa4-9758-0976f159da7b

📥 Commits

Reviewing files that changed from the base of the PR and between c8faf40 and 93e84f2.

📒 Files selected for processing (3)
  • .claude-plugin/marketplace.json
  • .claude-plugin/plugin.json
  • skills/audit/SKILL.md

Comment thread skills/audit/SKILL.md
Comment thread skills/audit/SKILL.md
Comment thread skills/audit/SKILL.md
Comment thread skills/audit/SKILL.md
…, bounded loop-until-dry, manifest covers every audited input
@thedavidmeister

Copy link
Copy Markdown
Contributor Author

Reviewed e16cc44: ready — scope contract composed with #65's convention rewrite, all four CodeRabbit Major threads addressed and resolved (paths: substitution, bounded loop-until-dry, full-input manifest, worker-boundary enforcement answered by issue-pr-cron#157's runner-written gate), hygiene jobs replicated at 0.22.0.

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.

Scope is a bendless prohibition in the principles and a first-class concept in the stamp rules, so a PR review runs whole-repo

2 participants