SBAI-5905: parity bump to Epic lore 0.8.7 (695630be) via the maintenance overlay - #453
SBAI-5905: parity bump to Epic lore 0.8.7 (695630be) via the maintenance overlay#453BizaNator wants to merge 4 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…verlay Owner ruling 2026-08-02: parity is existential (UEFN projects get their lore version bumped by Epic automatically, so drift locks users out) and must never be blocked on the empty-root issue, which is High-not-Critical and requires the user to point at a hostile server. Option (a) chosen: carry the fix as an overlay AND take the parity. - Pin moves to BiloxiStudios/lore @ 2052749e3 = Epic main 695630be (0.8.7-nightly, 36 commits from our base) with the SBAI-5909 empty-root fail-closed fix rebased on top. Upstream still lacks that fix, verified at 695630be. The overlay retires itself when Epic accepts SBAI-5917. - All six pin surfaces updated deliberately (manifest, src-tauri dev-dep, lock, both node policies, the Rust contract) — the byte-exact accepted constants are exactly the friction those guards exist to create. - Lock: 13 source repins + 9 crate version bumps to 0.8.7-nightly + removal of memmap2/rayon/rayon-core, which upstream dropped with the rayon compute pool. Hand-constructed, no cargo re-resolution, so ZERO unrelated resolver churn; `cargo metadata --locked` passes. - KNOWN BREAK FIXED: Epic removed `direct_file_io` from the facade clone args (and the C ABI) in the runtime split, so it is removed from our clone binding with a comment recording why. No caller ever set it. Audited commit-by-commit across all 36 commits. LoreEvent is untouched, so exhaustive matches are unaffected; no protocol/wire changes. Verification: cargo test -p loregui -p lore-vm = 0 failed (764 lib + every integration binary); cargo metadata --locked OK. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Unlike the SBAI-5910 host-only move (which produced a zero diff), this bump genuinely changes the dependency set: upstream removed the rayon compute pool and memory-mapped reads, so memmap2, rayon and rayon-core leave the graph. Verified the attribution delta is exactly those three crates being dropped, with NO crate added.
The 0.8.7 parity bump turned the integration job red on a guard, not on behaviour: both the canary script and its Rust twin asserted the lore binary reported "lore 0.8.6-nightly", so the bump failed with "unexpected lore binary version ... lore 0.8.7-nightly+0". A version literal in a parity guard means every upstream release reds the pipeline until someone hand-edits two constants. That is the opposite of the automatic-parity mandate, and the constant is not what makes the guard useful anyway. Both sites now read [workspace.package] version out of the pinned checkout's own manifest and compare against that, table-aware and fail-closed when the table or key is missing. The guard keeps the protection it was written for. The rev-parse check above it proves the SOURCE tree sits at the pinned rev; it cannot see a stale binary left in that checkout's target/ from a different release. Comparing against the version the checkout declares still catches exactly that, and now spans releases instead of one. Verified against both real checkouts (ba92f94 declares 0.8.6-nightly, 2052749 declares 0.8.7-nightly), and by seeding the violation the guard exists for: a binary reporting 0.8.6 under the 0.8.7 source tree exits 1 with "unexpected lore binary version ... (checkout declares 0.8.7-nightly)". The previously failing canary now runs green end to end on 0.8.7, including the behavioural unix_service_resolves_relative_repository_against_caller_root proof, so 0.8.7 is compatible rather than merely unblocked.
6a3b64f to
471f2f1
Compare
CI caught what local runs did not: the byte-exact lock-delta contract modelled only "13 source repins + one loregui -> lore-credential edge", so the 0.8.7 bump failed it even though the head lock is exactly what this PR claims. The contract was right to fail — the lock genuinely changed in ways it had never been told about. The fix is to model the delta, not to relax the comparison. The construction now applies every declared change and still byte-compares the whole file from the clean main base 0284b3e: 13 source repins 9 lore crates bumped 0.8.6-nightly -> 0.8.7-nightly 3 edges gained (loregui->lore-credential, lore->uuid, lore-macro->proc-macro2) 3 edges dropped (lore-base->rayon, lore-revision->memmap2, lore-storage->memmap2) 3 crates removed (memmap2, rayon, rayon-core) Those constants are declarations of intent: they are supposed to change on every bump, and changing them is the reviewable act — no crate can leave the graph and no edge can appear without being written down here. The structure is generic, so the next bump edits data rather than logic. Counts are asserted, so a base that moved under us fails loudly instead of silently constructing a different "permitted" lock. Widening what a guard permits is exactly when it can become a blanket allowance, so a new test seeds four mutations of the same KINDS the contract now sanctions — an undeclared package removal, edge addition, edge removal and version bump — and requires each to be rejected by name. The adversarial context-swap fixture still rejects too. All seven node contract files pass: 50 tests, 0 failures.
BizaNator
left a comment
There was a problem hiding this comment.
SOURCE BLOCK — exact head 987d7108ae4f1bf1042c9077044e419974146d07 only. This is not a merge authorization.
-
The required mixed-unit timestamp compatibility layer is absent, and this pin changes live product semantics. Epic commit
6fd18e6cchangesRepository.created,Branch.created, and thin-clientRevision.timestampfrom seconds to milliseconds. The audited range changes four.protofiles, so the PR statementNo protocol/wire changes: zero .proto/schema files touchedis factually false. At this head,frontend/src/BranchesPanel.tsxandfrontend/src/App.tsxstill multiply branch values by 1000, while lore-vm branch/repository info/list still documents seconds. A canonical millisecond value such as1718000000000therefore renders around year 56411. Old seconds records can coexist, so a simple switch to milliseconds would also break existing data. Jira comment 156675 and the approved5905-SEQ-Arequire a separate rollback-survivable PR1 on the 0.8.6/security pin first: centralized0 => placeholder,0 < value < 100000000000 => seconds-to-ms, otherwise canonical ms; normalize displays and relevant history/activity inputs; prove seconds/ms equivalence, no double scale, zero, and overflow. Then restack this PR2 on that reviewed head. -
The parity workflow did not run on the parity pin PR.
.github/workflows/upstream-parity.yml:19-24filters PRs to three parity scripts plus the workflow. It excludes all six pin-bearing surfaces changed here:Cargo.toml,Cargo.lock,src-tauri/Cargo.toml,scripts/lore-pin-policy.mjs,scripts/exact-pin-authless-contract.mjs, andsrc-tauri/tests/lore_pin_contract.rs. Live branch run history forupstream-parityis empty, so there is no exact-head detect/signature/current-pin canary result. This is a blocking AC3 defect, not a follow-up: add every pin-bearing surface to the workflow and canonical copy, refresh the pinned digest, add trigger regression coverage, and obtain a terminal exact-head run including canary. -
Binding acceptance evidence 4–7 is still missing. The ticket requires upstream lore-transport proof plus repeated/concurrent
>8command behavior; real remote-multiuser/two-clone concurrency and JWT/JWK/presign smoke; actual Linux x64, Windows x64, and macOS arm64 loreserver builds with native-header validation; and packaged-Windows Host/Create/Join proof with the audited sidecar. The green three-OSrelease-supply-chainjobs execute Node contract tests; they are not sidecar builds. Keep these gates visible and attach exact-head artifacts before clearance. -
Delivery order still denies merge. This PR is stacked on #450 at
9f8e80486dcf0b3753023dcc1de130f41d98e8d3; #450 remains OPEN and security-held pending its own independent behavioural verdict. SBAI-5905 itself remainsPendingReviewwithon-holdandsecurity-review. #450 must clear first; the timestamp compatibility PR1 must precede this PR2; then the new head/base gets a fresh review. #446 retains its separate DoD7 hold.
What passed at this head: OPEN/non-draft/MERGEABLE/CLEAN; all 16 GitHub check runs plus Vercel are green; the Biloxi pin 2052749e is Epic 695630be plus only the empty-root credential overlay; lockstep pin, lock and license deltas are internally sound; version derivation is checkout-scoped and fail-closed; the 34 local Node contract tests, locked metadata, fmt check, exact-pin negatives, and caller-root integration proof pass. Minor correction: Cargo.toml:26 and src-tauri/tests/lore_pin_contract.rs:21 still describe old ba92f943 provenance.
Please keep 987d7108 frozen as the rejected oracle, amend on a new head, and request a full exact-head rereview. — sb-lore
HOLD — structurally unlandable: its base is another open PROwner: the SBAI-5905 lane, blocked behind the SBAI-5910 security lane. All 17 checks pass, but this cannot merge regardless of what Its base branch is Sequence: #450 lands → retarget this to Content note, since this PR is easy to mistake for a duplicate of the bot bump I just closed (#458): it is not. The difference is the host, not just the rev.
#458 kept the pin on upstream It also carries unique coverage — Held, not closed. Nothing at risk. (This comment was edited to repair two values that a shell quoting fault dropped from the original post — the host/rev pair above. Correcting rather than leaving a garbled record.) |
Resolves SBAI-5905. Brings LoreGUI to Epic
lore0.8.7-nightly (upstream main695630be, 36 commits from our base9664606f5— the ticket said 27; Epic moved three times while this was parked).Stacked on #450 (SBAI-5910). Review that first; this branch contains only the parity commits on top.
Why now
Owner ruling (2026-08-02): parity is existential, not hygiene — UEFN projects get their
loreversion updated by Epic automatically, so drift makes LoreGUI incompatible and locks users out of their own projects. Parity must never be blocked on the empty-root credential issue, which is High-not-Critical (no RCE, not remotely triggerable, requires pointing the client at a hostile or look-alike server).How the overlay keeps both
The pin moves to
BiloxiStudios/lore @ 2052749e3, which is Epic main695630bewith the SBAI-5909 empty-root fail-closed fix rebased on top. Upstream still lacks that fix — verified directly at695630be, the predicate is byte-identical to our base and still returnstruefor an emptyacceptable_root_domains. So we take the newest engine and keep the fix; the overlay retires itself when Epic accepts SBAI-5917 (patch prepared, awaiting the owner's DCO sign-off since Epic's DCO is explicitly a representation about the signer's personal knowledge).The audit, and what it cost
All 36 commits were audited commit-by-commit. The first 27 were clean; the 9 added since were not.
direct_file_iofromLoreRepositoryCloneArgs(and from the C ABI, a silent struct-layout change) in the runtime-split commit. We used it in three places incrates/lore-vm/src/ops/repository/clone.rs. Removed, with a comment recording why so nobody re-adds it. No caller ever set it, so deleting beat leaving a no-op flag that lies to callers.lore-baserayon compute-pool API, twolore-storagere-exports, anddetermine_node_source. NewFileAction::Graftvariant exists but the facade does not re-exportFileAction, so we're unaffected.LoreEventis untouched across all 36 commits — exhaustive matches are safe..proto/schema files touched.Lock and licenses
0.8.7-nightly+ removal ofmemmap2,rayon,rayon-core(upstream dropped the compute pool and mmap reads). Hand-constructed from the base with nocargo update, so there is zero unrelated resolver churn;cargo metadata --lockedpasses.src-tauridev-dep, lock, both node policies, the Rust contract). That friction is the pin guards working as designed.Upstream commit
1fe7e28changes merge semantics under a sparse view: a conflict at a view-excluded path is now silently auto-adopted as "theirs", recorded asStagedMergeTheirs, and counted as merged rather than conflicted. Nothing is written for the user to inspect — no~mine/~theirs/~basecopies.Consequence for us: LoreGUI's merge result would report "0 conflicts" while the engine made a decision on the user's behalf, on files they cannot see. That is a trust defect, not a parity footnote. In-view conflicts are unaffected. It is discoverable via the
StagedMergeTheirsflag /FileAction::Graft, and should be surfaced in the merge UI. Filing separately rather than smuggling a UI change into a dependency bump — flagging loudly here so it is not lost.Also note:
LORE_WORKER_THREADSandLORE_COMPUTE_THREADSare retired upstream and now silently ignored (LORE_MAX_THREADSis the single knob).Self-flagged, same discipline as #450.
integrationwas red on this branch and it was not a 0.8.7 incompatibility — it was a guard that had a version number written into it.scripts/exact-pin-service-cwd-canary.shand its Rust twin incrates/lore-vm/tests/service_unix_smoke.rsboth asserted the binary reportslore 0.8.6-nightly, so the bump failed withunexpected lore binary version ... lore 0.8.7-nightly+0.Why the constant was not simply bumped. A version literal inside a parity guard means every Epic release reds this pipeline until someone hand-edits two constants. Bumping 0.8.6→0.8.7 re-arms the identical landmine for 0.8.8, and automatic parity cannot depend on a human remembering a string. Both sites now derive the expected version from the pinned checkout's own
[workspace.package]table — table-aware, and fail-closed if the table or key is absent.The guard did not get weaker. Its purpose is catching a stale binary left in the checkout's
target/from a different release — something therev-parse HEADcheck above it cannot see, because that inspects the source tree rather than the artifact. Comparing against the version the checkout declares still catches exactly that, and now spans releases instead of one.Demonstrated, not asserted:
ba92f94→0.8.6-nightly,2052749→0.8.7-nightly(the exact before/after of this bump)unexpected lore binary version ... (checkout declares 0.8.7-nightly)versionkey in an earlier table[workspace.package]missing entirely""which would match anythingunix_service_resolves_relative_repository_against_caller_rootproofThat last row is the one that matters for the parity mandate: 0.8.7 is compatible, not merely unblocked. The exit code was verified directly — a shell pipeline had masked it as 0 on the first attempt, which is the same false-green shape worth watching for in review.
What a reviewer should check: that the derived value is read from the pinned checkout's manifest and not the loregui workspace manifest (a wrong root would make the comparison self-fulfilling), and that both the shell and Rust readers are table-scoped rather than first-
version-wins.Also in this push: restacked onto the reviewed #450 head
9f8e804, which this branch needed for the pin-host and overlay fixes. Uncommitted duplicates of the pin-host fix were sitting in the worktree; they were diffed against #450's committed version and confirmed a strict subset before being discarded.Second self-flagged gate change.
scripts/lock-delta-contract.test.mjsmodelled the permitted lock as base0284b3e7+ 13 source repins + oneloregui → lore-credentialedge, then byte-compared the whole file. The 0.8.7 bump changes more than that, so CI failed this PR — correctly. The lock genuinely changed in ways the contract had never been told about, which is precisely what it exists to catch.The delta was derived from the artifact, by diffing the real head lock against the constructed one, rather than assumed from the PR description:
0.8.6-nightly→0.8.7-nightlyloregui→lore-credential,lore→uuid,lore-macro→proc-macro2lore-base→rayon,lore-revision→memmap2,lore-storage→memmap2memmap2,rayon,rayon-coreThe reconstruction is byte-identical to the head lock from the clean main base. That independently confirms the delta this PR advertises, including "no crate added" — both new edges point at crates already in the graph.
The comparison was not relaxed. It is still a whole-file byte compare; what changed is that the construction now models the delta a parity bump actually produces. The constants are declarations of intent: they are supposed to change every bump, and changing them is the reviewable act — no crate leaves the graph and no edge appears without being written down. The structure is generic so the next bump edits data rather than logic, and the counts are asserted so a base that moves underneath fails loudly instead of silently constructing a different "permitted" lock.
Because widening a guard is when it can quietly become a blanket allowance, a new test seeds four mutations of the same kinds the contract now sanctions — an undeclared package removal, edge addition, edge removal, and version bump — and requires each to be rejected by name. All four are; the pre-existing adversarial context-swap fixture still rejects. Seven node contract files, 50 tests, 0 failures.
What a reviewer should check: that
ADDED_EDGES/REMOVED_EDGES/REMOVED_PACKAGESmatch the audit in this PR body and contain nothing else, and that the four seeded mutations really are the same kinds the contract now permits — a seeded violation of a kind it never permitted would prove nothing.Note on the pattern
Both gate changes in this PR are the same family: the version guard hardcoded a version, the lock contract hardcoded a transition shape. Both were written to protect parity and both broke on a parity bump. A guard whose correctness depends on the pin never moving will red the pipeline the day Epic ships — worth treating as a review smell.
Verification
cargo test -p loregui -p lore-vm: 0 failed (764 lib tests plus every integration binary) ·cargo metadata --lockedpasses ·cargo fmt --checkclean · node contracts 33/33 · canonical workflow fixtures 8/8 · SBAI-5906's watcher test 1/1.No merge from me; no release, tag, or manifest mutation.
🤖 Generated with Claude Code