Commit graph Idunn/docs
Author SHA1 Message Date
Meta Vens
3cedfef50a Map: fold in the Odin-lifecycle authority audit and the 2026-09-30 rulings
Records Q-O1 (Idunn proves; supersedes Q1 (b)), Q-O2, Q-O4, Q-O5 and the struck
Q-B4 held clause; Q-O3 open. Adds the audit site table and target authority
map (section 5), cuts X1, A1, B4prime, A2, A3, O-R, L-R, marks R1 superseded by
A1, records Odin's temporary fatal rule and the Soul open items, and updates the
Cut status block.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 00:14:51 +02:00
Meta Vens
97fb2b8871 Map: B2 rework plan, D1/T1/T2/W1/R1 cuts, and the 2026-09-30 rulings
Splice the B2 rework map (owner map, per-file cut, verification, live
relevance, subtraction estimate) under B2; add cuts D1, T1, T2, W1 and R1;
record Q-B2-1 (a), Q-B2-2 (fail at once), Q-R1 (a) and Q-B4 (routed by
Idunn's route proof, unrouted by admission plus workload; the Odin non-Ready
veto clause held open). B4 is blocked on the Odin-lifecycle authority audit.
B2, D1, R1 ready for Hands; W1, T1, T2 in progress on hands/idunn-w1-t1-t2.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-29 23:44:25 +02:00
Meta Vens
94c7691cb6 Map: the C2 acceptance hour passed; Odin 5c37860 deployed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 22:56:10 +02:00
Meta Vens
7480ee9d1c Map: StreamPixels ship completed through Idunn
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 21:55:34 +02:00
Meta Vens
28662cb807 Map: ship log for the B3 install, the Raven actuator and the bulk fetch bug
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 21:05:35 +02:00
Meta Vens
ae3788909a Map: B3 follow-ups and the dead-hold report ruling
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 20:15:08 +02:00
Meta Vens
bf2c645a60 Map: B3 fix batch Soul pass 3 and the held pre-fence cancel ruling
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 19:35:16 +02:00
Meta Vens
3803725bf2 Record the Odin timeout diagnosis and the Idunn-first ship order
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 17:21:25 +02:00
Meta Vens
7dc3a4bb8c Record the live store decode, B3 pass 2, and the ship sequence
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 17:00:39 +02:00
Meta Vens
8d1dc9a87e Record the B3 fix batch and the hold / rollout rulings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 14:09:04 +02:00
Meta Vens
771138a164 Record B2 Soul rejection and the rollback / first-deploy rulings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 13:41:17 +02:00
Meta Vens
6501cafda3 Record B3 Soul verdict and the recipe-declares-readiness ruling
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 12:46:32 +02:00
Meta Vens
a61540b93f Merge route continuity B1: a continuity abort cleans its own projection
A continuity abort demotes the shared key to Expected-only with its own
exact activation, and never withdraws the Expected. a148802 is reverted.
Pre-B1 terminal continuity aborts keep their phase under a
LegacySkippedBeforeB1 marker that only the lift can construct. Boot
reconciliation is the single owner of legacy residue and demotes only by
exact identity. Supervision records a failed pre-restart demotion and
defers instead of minting a continuity. Scheduler faults are isolated per
transaction and backed off, reported once and kept in the record. Queued
commands freeze every tick, so one wedged target cannot starve the
others. An unreadable history fails closed for freezing. boot is a
separate, tested step.

Soul made four passes. The first found boot-wedging on legacy records.
The second traced it to Self's ruling to reopen terminal records, which
was replaced with one owner for the cleanup. Pass three found
cross-target starvation, and pass four found fault re-arming. 241 tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 10:37:54 +02:00
Meta Vens
3d4c9d34f1 Correct the B1 legacy ruling: no reopen, reconciliation owns the residue
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 07:10:31 +02:00
Meta Vens
9e5b7f84fd Close the B1 transition: lift, precondition, boot reconciliation, closed history
Soul found B1's rule sound and its transition unsafe. This makes the rule's
old inputs impossible to reintroduce a stuck state from.

- The control store's legacy lift owns the transition. A pre-B1 continuity
  abort that issued an activation lifts with topology_reconciliation Pending,
  so the one resolution demotes its own activation. A record already terminal
  under the old rule is reopened at Starting, since a terminal record cannot
  owe work. History lifts records as written. Before this, one resident
  record of that shape failed validation and ControlSnapshot::read refused the
  whole store, so Idunn could not boot.
- Supervision owns the Expected-only precondition. When its pre-restart
  demotion fails it mints no continuity and writes next_restart_at_unix_millis
  on the generation's ContinuityBackoff (attempts and window untouched), so it
  neither restarts over an undemotable projection nor retries every tick.
- Boot reconciles once: a projected activation that exactly matches the
  activation a failed continuity in history (or a resident terminal record)
  issued is demoted. Nothing is adopted; an activation no admitted generation,
  live transaction or failed issuer accounts for is reported and left alone.
  New read-only CultCacheTopologyDriver::projected_activation.
- Unreadable history.cc fails closed. The continuity restart ceiling and the
  consumed-command check no longer read an empty history; they stop, and the
  fault is reported once while it lasts (ReportOnce). The undecodable-record
  report is a pure function, pinned.
- docs/deployment-authority.md no longer says the projection never drifts.

Tests: legacy fixtures written by the 9001b58 encoder for the three abort
shapes (a second throwaway generator, see the fixtures README), driven through
the Engine; the seeded-transaction helper now takes a command kind and an
incumbent, and a Deploy carries a frozen-source receipt and a signed brake
release, so Deploy commit, Deploy pre- and post-fence aborts and a continuity
abort over an incumbent run through the real phase machine.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 06:11:29 +02:00
Meta Vens
4b5e60fb12 Merge origin/main into idunn/route-b1
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 05:13:07 +02:00
Meta Vens
c03d646ae6 Record S3 and C2 code status; hold the StreamPixels merge until B3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 04:15:58 +02:00
Meta Vens
b570114ae6 Record Soul on C1, and widen C2 to the StreamPixels service
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 03:01:45 +02:00
Meta Vens
35e4fad8ab Record Soul on B1 and rule its fix batch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 02:38:33 +02:00
Meta Vens
d795e09a9e Widen B2 to the two storm paths Soul found beyond S1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 02:28:28 +02:00
Meta Vens
44277698c3 A continuity abort resolves its own projection (route continuity B1)
A continuity candidate shares the admitted Expected key. Both abort intents
marked its topology reconciliation Skipped, so a failed continuity left its
candidate activation projected under the admitted key while the admitted
receipt named the older one, and a later deploy's post-fence demotion refused
as substituted.

DeploymentTransaction::abort_topology_reconciliation is now the one rule for
both intents and pre-fence validation: a deployment owes the projection when it
published its Expected, a continuity owes it when it issued an activation.
reconcile_failed_candidate_projection is the one resolution for both abort
paths: a deployment withdraws its own key, a continuity demotes the shared key
to Expected-only with its own exact activation and never withdraws the
Expected. The post-fence incumbent demotion stays deployment-only and exact.

Tests read the persisted topology store after the production
publish/demote sequence.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 01:30:19 +02:00
Meta Vens
87fa57dd8c Revert "Recover fenced rollback from current activation"
This reverts commit a148802cb6.

Rollback after fencing adopted whatever activation was projected under the
shared Expected key, so a continuity abort's leftover activation could be
demoted by a later deploy. The drift is closed at its source by the next
commit: a continuity abort demotes its own exact activation. Rollback demotes
the admitted generation's exact activation again.

The doc paragraph is dropped; the 9f00e7a paragraph above it stays until B4.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 01:30:09 +02:00
Meta Vens
9001b58f4b Record the operator's rulings on route continuity Q1-Q6
All six were ruled as recommended, one at a time, on 2026-09-29. Q6 adds
a Soul pass on the weekend CultLib branch before it merges. The campaign
moved to the Eureka session "Codebase audit".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 00:54:05 +02:00
Meta Vens
5bbb4616dd Add route continuity cut map, Imagination pass 0b
Body facts, identity/lifecycle/authority table, six operator questions and a
draft cut list (S1, B1, F0, B2-B5, S2, C1, S3/C2) for the route-continuity
target. Campaign handed to the "Codebase audit" Self session; operator forks
are ruled there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 00:48:49 +02:00
Meta Vens
d719485825 Add route continuity and admission target
Eureka target for the route-continuity rebuild after the 2026-09-28 StreamPixels
deployment failure: observation never actuates routing, failure never
accelerates actuation, web apps prove over their own HTTP route, every
post-fencing phase ends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 00:33:20 +02:00
Meta Vens
865190611f Accept dynamic primary group in workload audit 2026-09-28 15:19:52 +02:00
Meta Vens
9f00e7ab84 Replay admitted provider receipts at admission time 2026-09-28 14:47:55 +02:00
Meta Vens
f0465e5c9a Document Rust container shell requirement 2026-09-28 14:20:51 +02:00
Meta Vens
7a61c77420 Revert "Continue commit from refreshed topology receipt"
This reverts commit 55e5d559d6.
2026-09-28 14:20:26 +02:00
Meta Vens
55e5d559d6 Continue commit from refreshed topology receipt 2026-09-28 14:18:22 +02:00
Meta Vens
a148802cb6 Recover fenced rollback from current activation 2026-09-28 13:56:05 +02:00
Meta Vens
022096c45e Place StreamPixels on Idunn v2 migration path 2026-09-27 22:20:36 +02:00
Meta Vens
99d3e86d03 Record the ninth batch: the frozen-source digest was exposed too
The version tag could not be recorded where the ruling said, because the
stored value is validated to a bare sha256 shape by a pinned dependency in
another repository. Hands implemented an equivalent implicit version read,
flagged the divergence, and asked whether proceeding was right. It was: the
ruling named a mechanism, the hazard was live, and halting would have left the
fleet exposed.

Five tests prove it by failing without the fallback, which is the point, since
the whole finding was that nothing had ever exercised the stored path.

The frozen-source digest turned out to have the same exposure through a
narrower window, and this cut's own sixth and seventh batches crossed it
twice. Same answer applied, with the prior shapes reproduced from git history
rather than from memory.

Hands also spotted a third instance and declined to chase it: the systemd
actuator compares a raw content-only digest read through procfs against a
stored value now carrying mode, gid and xattr terms. Two different algorithms
compared to each other, which is the same defect a third time. Flagged for its
own look rather than guessed at.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 05:54:43 +02:00
Meta Vens
b029cd29b7 Record the eighth batch, and a migration hazard it did not raise
The bypass is a compile error now, proven by builds that fail on Soul's exact
spellings rather than by reading the lint config. The repository had no CI
surface at all before this, so there was nothing for "denied in CI" to attach
to until now.

Hands flagged that the single-file artifact digest format changed and reasoned
nothing compares against literals. That holds for fixtures and not for
receipts: two call sites in host.rs compare a freshly computed digest against
a stored value. So the first upgrade past this commit makes every already
installed workload fail "installed executable differs from Expected", and
every running one fail "the installed executable changed under the running
process". Idunn is the deployment and daemon-survival authority, and this
would land silently at restart across the fleet.

The ruling versions the digest and verifies in the version the receipt names,
rather than re-sealing admitted state to make new code agree with itself. It
is not closed until a test seals under the old format and verifies under the
new, because the whole finding is that nothing exercised the stored path.

Two bugs in this batch were found by running the suite rather than trusting
it, including a test that set an attribute on a root whose own metadata is
never hashed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 05:27:33 +02:00
Meta Vens
098febb996 Record Soul pass 8, and the cause under three passes of symptoms
The port can be walked around. Two spellings of the original bug restore it
with all 193 tests green, and the proof it leaks is already in the file: one
function still calls fs::read_link directly, and a probe measured sixteen
counted calls beside three uncounted syscalls. My record claimed the count was
total rather than conventional. It is still conventional; the convention moved
from remembering the counter to remembering the port. That is the second time
this record has overclaimed what a pin does.

The artifact digest's single-file path never got the ruling, and it is the
path the installed executable actually takes. Setuid, mode and a file
capability are all invisible there, immediately before launch. Every test for
it wraps the file in a directory so the other path runs, and one of their doc
comments claims to pin exactly the scenario it does not reach.

The xattr framing is sound and nothing proves it. The suite stays green with
values dropped entirely, so a capability edited from cap_setuid to
cap_sys_admin is covered by no test.

Soul named one cause with three faces: every pin here is a convention a later
edit steps around, and the fixtures use the convenient shape rather than the
one production uses. So the eighth batch makes the bypass a compile error and
moves the tests onto the production shape, instead of adding a ninth round of
point fixes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 04:51:18 +02:00
Meta Vens
bcf9de3837 Record the seventh batch: the pin now catches its own regression
193 tests, and the mutation that passed in 0.39 seconds on pass 7 now fails.
Putting canonicalize and symlink_metadata behind a port that charges the
counter inside the same method as the syscall is what turned an honour system
into a measurement; the hand-placed call sites are gone.

The validator mask tests are precise rather than merely red: narrowing the
file mask fails exactly the setgid test and narrowing the directory mask fails
exactly the setuid one, with the other five staying green. That is the
evidence they pin single bits.

The unreachable test is deleted rather than repaired, with a note saying why
the defence it claimed never existed. The xattr tests close Soul's file
capability finding and state in their own doc comments that the probe runs as
root and proves nothing about an unprivileged attacker.

Hands shipped a compile bug in the first commit and its own Yggdrasil run
caught it before the report. That is the order these should happen in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 04:37:09 +02:00
Meta Vens
9d86ca1f60 Record Soul pass 7: three pieces of verification that do not verify
Soul restored the exact bug this line of rulings exists to prevent, without
instrumenting it, and the new call-count pin passed in 0.39 s. The counter
only counts calls someone remembered to annotate, so it is an honour system
rather than a measurement. The code said so in a doc comment four lines below
the assertion; my record claimed the opposite. That record is corrected here.

The fixture I recorded as deleted for being unable to fail is in the tree,
still unable to fail. Hands' reasoning about why the collision class is
unreachable was sound and Soul retested it; what landed on top of that
reasoning was a test that cannot go red.

A file capability is invisible to both the validator and the digest, which is
the grant setuid used to be with no mode bit to see it. no-new-privileges
prevents it on our own deployment path, but the digest is the detection and
Cut 4's verdict claims the tree is the one we froze. The artifact digest also
got a single executable boolean where the ruling said full mode and gid, so a
post-install setuid re-verifies clean.

Six rulings for the seventh batch. The first moves filesystem access behind a
narrow injected port so the count is total rather than conventional, which is
the shape doctrine already asks for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 04:14:54 +02:00
Meta Vens
7de13c8c1d Record the sixth batch, and withdraw the nosuid ruling I had not checked
183 tests green. The timing pin is now a call counter asserting an exact
formula, which is what it should have been before a clamp made a 1.63x
separation look like 33x.

I ruled the bind mount should carry nosuid. Docker exposes no such
per-bind-mount flag through either syntax, and Hands verified that against
the real CLI rather than arguing from memory. The container already runs with
no-new-privileges, which is process-wide and stronger than what I asked for.
The ruling is withdrawn: the prevention was already there and I ordered a
second one without looking.

Two fixtures in this batch would have lied and were caught by mutating rather
than reading. The container's chown clears a freshly-set setuid bit, so a
fixture that sets then chowns tests nothing. And the first observe_frozen test
tampered with the recipe file, which a different check inside observe_frozen
catches, so it stayed green with the digest check deleted.

The artifact digest's symlink terminator is deliberately left unpinned:
symlink(2) cannot put a NUL in a target, so no honest test exists. Hands built
one, confirmed it did not go red, and deleted it instead of keeping it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:39:58 +02:00
Meta Vens
a79d6282a3 Record Soul pass 6: the timing pin is a coin toss, and the digest misses setuid
Five of seven rulings hold. The containment argument, where I asked Soul to be
most suspicious after S5-8, survived twenty escape shapes it built itself.

R-I1's pin is not a ratio test. Its clamp fires on every run, so it reads as
"under 200 ms", and clean code has already measured 198.9 ms under the
three-slot load the operator just authorised. The reported 33x separation was
an artifact of that clamp; the real separation is 1.63x, which a slightly
faster host erases. It fails in both directions, and under Cut 4 a false red
is a false verify verdict on unattended work.

R-I3 is not met. The validator masks the mode to 0o777 and checks uid but not
gid, so setuid, setgid, sticky and gid are all permitted to vary and none are
hashed. A frozen binary made setuid-root re-observes clean against its
receipt, and the tree is bind-mounted into runner containers with no nosuid.
The ruling adds the mount flag as well as the digest terms: the digest detects
and the flag prevents, and the flag costs a mount option.

Soul also found that the artifact digest still has the blindness the frozen
source digest just lost, and that observe_frozen, which is the tamper check
itself, has no test at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 22:52:10 +02:00
Meta Vens
38502d1c21 Record the fifth batch, and the containment escape my own ruling would have shipped
All seven rulings landed, 175 tests green, and every new test dies under its
own mutation. The two-link cycle fixture hangs rather than asserting, which is
the correct falsification: nothing but the budget bounds a cycle, so a timeout
is what a broken budget produces.

The batch's real finding runs the other way. Soul called three containment
checks redundant and I ruled delete them. Hands deleted two, hand-traced the
third, and found that with all three gone a symlink whose whole target is ".."
at the root resolves to the parent of the root and returns Ok, because no
later Normal step ever runs to trip the other arm. That is a containment
escape, the exact class this resolver exists to prevent. Soul was wrong, my
ruling repeated it, and a hand-trace caught it.

Soul's HTTPS rig had also evaporated: no session, no work directory, no
scratch trace. Hands rebuilt it from this map's description, which worked only
because the description was detailed. A probe that is going to be committed
has to be handed over while it still exists.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 22:32:31 +02:00
Meta Vens
8da8e99a0b Record Soul pass 5: Cut 1 closes on mechanism, and the bill it leaves
Soul could not falsify any claim the fourth batch made. What it found instead
is that the S4-1 fix reached the exponent and not the per-component cost, and
that the line responsible is dead code: the value is already canonical, so
deleting four lines removes a cubic term and leaves the suite green.

The other half of the bill is coverage. The traversal budget is the only thing
that terminates a symlink cycle and nothing tests it; cargo-mutants missed two
mutants on that single line. The digest that serves as the tamper check is
blind to symlink targets and to the executable bit, both of which the
validator permits to vary. S4-6 was reported landed and has no test at all.

Seven rulings for the fifth batch. R-I5 departs narrowly from my earlier
"keep S6's behaviour exactly" and says so rather than letting it pass as
drift: the 40-traversal ceiling matches the kernel's own ELOOP limit and is
kept, but it must be declared and the error must name the link.

FU-Heimdall-Gitlink cleared upstream on its own. Heimdall froze end to end,
945 entries, zero mismatches. The ops follow-up closes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 21:42:40 +02:00
Meta Vens
12a7f16a61 Record the fourth Cut 1 fix batch
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 20:47:45 +02:00
Meta Vens
d562a12238 Record Soul's fourth pass: the new symlink resolver is exponential
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 20:07:24 +02:00
Meta Vens
4c28727434 Record the third Cut 1 fix batch
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 19:34:46 +02:00
Meta Vens
04afdedcf0 Record Soul's third pass on Cut 1 and rule the third fix batch
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 18:56:38 +02:00
Meta Vens
81d1009aa2 Record the second Cut 1 fix batch
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 18:33:24 +02:00
Meta Vens
f7be933de3 Record Q-V9 and Q-V10 ruled A by Self; every verify question is now settled
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 17:59:21 +02:00
Meta Vens
4aa8d3b3b7 Record Epiphany's measured build memory under Q-V6
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 17:34:00 +02:00
Meta Vens
d2a98edbaa Record Soul on the Cut 1 fix batch: the raw freeze is slow and can write outside its root; rule the fix
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 17:26:23 +02:00
Meta Vens
9fb6c1a615 Record Q-V6: 2 jobs, 4 CPU and 12 GiB each, from measured build memory
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 17:12:02 +02:00