audit: enforce the deploy-repo / library-repo release-lifecycle split - #74
Conversation
New Domain rule: every repo is a library repo (rainix-autopublish, next-version lifecycle, no per-tag record) or a deploy repo (rainix-tag-release, frozen src/generated/<tag>/ record, version moves only at release) — never both. Derive nature (frozen record present?) and lifecycle (which reusable the workflows' uses: lines call) independently; flag a deploy repo on the library lifecycle (HIGH — the permanently-red version == DEPLOY_TAG treadmill), both reusables in one repo (HIGH), and lifecycle/nature mismatches without the treadmill (LOW/MEDIUM). Composes with the existing Deterministic-production- deployments and Deploy-pin-completeness Domain rules by reference; Hazard cat. 9 cross-references it as a release-record hazard. Closes #53. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 54 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the 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 configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
WalkthroughChangesThe audit skill now checks library and deploy repository release lifecycles, frozen deployment artifacts, workflow usage, and version synchronization. Plugin manifests and the skill version are updated to Audit lifecycle changes
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related issues
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
QA record for c6c833d: Version-hygiene CI replicated locally with jq before push (both jobs): The frontmatter Fact-check of the rule's claims against live sources (independent of the issue text):
Dimension-0 self-review of the added text caught before push: a false claim (st0x.deploy IS named Composition, not duplication: the rule references Deterministic production deployments, Deploy-pin completeness & release historicals, and the |
…fied first — nature and lifecycle audit conformance to it (human ruling)
|
Classification inverted on the human's ruling (234b0d4): the skill identifies each repo's DECLARED kind FIRST from the .deploy naming convention — the name is the org's canonical statement of which lifecycle the repo is on — and nature (frozen record) and lifecycle (uses: lines) are then audited as evidence of conformance TO that declaration, any disagreement flagged. The prior text treated the name as proving nothing; the counterexamples it cited (pre-split rain.factory, st0x.deploy on autopublish) are now correctly framed as the drift the rule catches, not reasons to distrust the name. Non-finding re-keyed to all-three-agree. Lifecycle content itself verified current against today's rain.deploy soldeer-gate behaviour and rainix#282's manual-dispatch split. |
There was a problem hiding this comment.
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 `@skills/audit/SKILL.md`:
- Around line 186-195: Update the lifecycle-detection guidance in the
“Lifecycle” section to parse workflow YAML and inspect active job uses values,
matching only the canonical rainix-autopublish and rainix-tag-release references
at `@main`. Do not classify repositories from raw filename substrings; treat
malformed or ambiguous workflow YAML as requiring verification rather than as a
lifecycle match.
🪄 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: e7fe1e9c-0829-4ffc-bd05-f8f7c7ca890e
📒 Files selected for processing (3)
.claude-plugin/marketplace.json.claude-plugin/plugin.jsonskills/audit/SKILL.md
…hing canonical refs, fail closed on ambiguous YAML
|
Reviewed abb6418: ready — lifecycle split with the .deploy name as the declared kind first (human ruling), parsed canonical uses: refs fail-closed per CodeRabbit's thread (addressed and resolved), treadmill HIGH with canary protected, 0.27.0. |
Closes #53
What
Adds the Release-lifecycle split Domain rule to
skills/audit/SKILL.md: every rainlanguage Solidity repo is strictly a library repo (rainix-autopublish, next-version lifecycle, importable surface, no per-tag record) or a deploy repo (rainix-tag-release, frozensrc/generated/<tag>/record,[package].versionmoves only at release) — never both. Plus a one-sentence cross-reference from Hazard category 9, which reaches the same finding as a release-record hazard.The check
Derive two facts independently, then flag disagreement:
src/generated/<tag>/*.pointers.soltag dirs,Lib*Deploy*.solpinning*_DEPLOYED_ADDRESS/*_DEPLOYED_CODEHASH)? Classify by the record, never the*.deployname — pre-split rain.factory carried the record without the name; st0x.deploy carried the name while on the wrong lifecycle.uses:lines of.github/workflows/*.y*mlforrainix-autopublish.yamlvsrainix-tag-release.yaml. Filenames prove nothing: verified that rain.factory and rain.factory.deploy, on opposite lifecycles, both name their callerpackage-release.yaml.Flags: deploy repo on the library lifecycle (HIGH — the permanently-red
version == DEPLOY_TAGtreadmill, withtestDeployTagnamed as the canary and explicitly protected from being "fixed" by deletion); both reusables in one repo (HIGH); mismatches without the treadmill (LOW/MEDIUM, with an explicit routing note that a tag-release caller that deploys and freezes nothing escalates to the existing no-release-record HIGH instead). Non-finding: the record iff tag-release, surface-only iff autopublish — including either half of a completed split pair.Placement and composition
@mainshared-CI rule by name rather than restating any of them (named refs, not positional "the rule above", since siblings are inserting into this list concurrently).Verified against live sources (not taken from the issue text)
rainix-autopublish.yamlandrainix-tag-release.yamlboth exist in rainlanguage/rainix.github/workflows/.0_1_8 != 0_1_9 → 0_1_29red-treadmill measurement.maintoday is the live both-lifecycles example (callsrainix-autopublishwhile carryingsrc/generated/0_1_3..0_1_5/snapshots).package-release.yaml(why the check grepsuses:lines).Version lockstep
0.23.0 → 0.24.0in.claude-plugin/plugin.json,.claude-plugin/marketplace.json, and the SKILL.md frontmatter. Both version-hygiene CI jobs replicated locally with jq before push: plugin==marketplace PASS; skills/ changed with bump vs base PASS (0.23.0 → 0.24.0).QA
.deploy" — st0x.deploy IS so named), two fragile positional cross-references ("the two rules above" → named rule refs, load-bearing while nine sibling PRs insert into the same list), and a severity self-contradiction ("never this LOW" beside a LOW/MEDIUM rating).github/workflows/listing (both reusables exist), merged rainix#280/#282 bodies (lifecycle semantics, treadmill measurement, manual-deploy decoupling), rain.factory + rain.factory.deploypackage-release.yamlcontents fetched from GitHub (opposite lifecycles, identical caller filename — why the check grepsuses:lines), open rain.factory#46 (the split shape and the live both-lifecycles repo)version == DEPLOY_TAGcanary — covered, canary named and protected from deletion-as-fix; (b) both-reusables HIGH — covered; (c) lower-severity lifecycle/nature mismatches — covered, with escalation routing to the existing no-release-record HIGH; (d) the non-finding — covered, incl. completed split pairs; (e) why-audit-not-CI — covered in the rule's closing paragraph; (f) placement in Hazard-surface / Process — placed as a Domain rule + Hazard cat. 9 cross-ref, with the Process half deliberately not taken (dimension 0 reviews instruction docs, not workflows; reasoning in the body above)🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Chores