chore: mirror the pr-review rubric provenance contract from orbit-ui-mobile - #467
Conversation
… equal bytes
tools/launch-worker.mjs in orbit-ui-mobile sha256s the working-tree bytes of
.claude/skills/pr-review/{SKILL.md,rubric.md} in both repositories and refuses to
launch an independent reviewer for repo ui or api when they differ.
The committed blobs are already byte-identical:
SKILL.md b374cfd
rubric.md 308d1c7
Both repositories set core.autocrlf=true. orbit-ui-mobile pins
`.claude/skills/**/*.md text eol=lf`; this repository pinned only *.mjs and two
JSON artifacts. The same blob therefore checked out LF there and CRLF here,
+230 bytes on SKILL.md and +289 on rubric.md. `git check-attr text eol` reported
`eol: lf` in the UI repository and `eol: unspecified` here. `git status` was clean
in both, which is why nothing looked wrong.
Cost, measured on the overnight run of 2026-08-08: 76 tickets stood down rather
than opened unreviewable, and 4 pull requests handed over with no independent
review.
This commit changes no blob. It pins `.claude/**/*.md text eol=lf`, a superset of
the missing line that also covers every future mirrored document under .claude,
and re-materializes the working tree from the unchanged blobs.
Proof, both working trees after the change:
SKILL.md 3fbf6d133b4a7bafbe8da8345ea10d45ff96ac6b83d6c78f348651fa3c830059 13388 B
rubric.md 672f14194f2bc7834828d434babdad152d5b361b2059b75f34f5b0d370be72b6 20247 B
Gate proof: with .gitattributes reverted and the tree re-materialized, the launcher
prints "pr-review parity failed for .claude\skills\pr-review\SKILL.md". With this
commit applied it passes that check and advances to the next one.
Audit of every other path present in both repositories: 30 shared paths, 3 with an
identical committed blob, and only these 2 drifted. The other 27 differ in content
on purpose.
Refs ORB-215
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…mobile The pr-review skill is single-sourced in orbit-ui-mobile and mirrored here, and tools/launch-worker.mjs refuses an API review when the two copies disagree by committed blob. This is the mirror half of orbit-ui-mobile#701. The contract change: a review artifact now carries rubricRepositoryKey, rubricCommitOid, rubricBlobOid and rubricArtifactPath instead of rubricBaseOid. record-readiness.mjs proves all four with git and refuses the receipt when they do not hold, so a review bound to the wrong or a stale rubric cannot reach READY. For this repository the binding is always own-base: orbit-api carries .claude/skills/pr-review/rubric.md, so rubricRepositoryKey is api and rubricCommitOid is the pull request's own base SHA. The canonical-main binding exists for orbit-landing-page, which has no .claude tree at any commit and could therefore never mint a READY receipt at all. Body copied verbatim. Verified byte-identical to the UI copy: 86d428358a2b460db68d1a5c7db99d8aa5a5472bb2ed7ac093f69a819044decf MERGE THIS TOGETHER WITH orbit-ui-mobile#701. The blob-parity gate refuses every ui and api review in the window where only one of the two has landed. Refs ORB-215 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7750b001f7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - **The repository carries no rubric** (orbit-landing-page has no `.claude` tree at any commit). | ||
| `rubricRepositoryKey` is `ui` and `rubricCommitOid` is orbit-ui-mobile's current `origin/main`. |
There was a problem hiding this comment.
Materialize landing rubrics from the UI repository
For an orbit-landing-page review, this binding requires the rubric from orbit-ui-mobile, but the unchanged Resolve scope procedure still runs git show {baseRefOid}:.claude/skills/pr-review/rubric.md in the target repository, which this section explicitly says has no .claude tree. Following the skill therefore fails before a landing review can produce a receipt. Update the snapshot capture and blob-resolution steps to fetch and read rubricCommitOid from the repository identified by rubricRepositoryKey.
Useful? React with 👍 / 👎.
|



What this is
The pr-review skill is single-sourced in orbit-ui-mobile and mirrored here.
tools/launch-worker.mjsrefuses an API review when the two copies disagree by committed blob, so this is the mirror half of orbit-ui-mobile#701 and the two must land together.The contract change
A review artifact now carries rubric provenance instead of a single base SHA:
rubricBaseOidrubricRepositoryKey,rubricCommitOid,rubricBlobOidrubricArtifactPathrubricArtifactPath(unchanged)record-readiness.mjsproves all of it with git and refuses the receipt when it does not hold, so a review bound to the wrong or a stale rubric cannot reach READY.For this repository the binding is always
own-base: orbit-api carries.claude/skills/pr-review/rubric.md, sorubricRepositoryKeyisapiandrubricCommitOidis the pull request's own base SHA. That is exactly the strength the old rule had.The second binding,
canonical-main, exists for orbit-landing-page, which has no.claudetree at HEAD or at any commit and could therefore never mint a READY receipt at all. Four complete landing pull requests reportedREVIEW_STALEon 2026-08-08 for that reason.Verification
Body copied verbatim from the UI original. Both files hash to:
Merge order
Merge this together with orbit-ui-mobile#701. The blob-parity gate refuses every
uiandapireview in the window where only one of the two has landed. Order across the whole set:.gitattributeseol pin)Refs ORB-215