Changes touching this path

  • loot tutorial: guided nine-step walkthrough of the core model in a temp dir (#24) 9bae4337 · dbf3dbe6…
  • Say what a relay can actually read (#520) 11055d72 · dbf3dbe6…diff
  • loot tutorial: remove the temp tree on Ctrl-C (#513) fa318ba8 · dbf3dbe6…diff
  • what a peer declares in a negotiation is a type now, so the head list that strands a pull cannot be passed (#799) #40's fault-injection harness found a peer holding 3 of 6 files whose head had advanced to the sender's tip, with the negotiation reporting up to date. The ticket read that as "an interrupted pull cannot resume." It does resume: `pull_via_interrupted_fetch_resumes` has been proving that since #217, and `pull_via` declares `negotiation_have()` at all three of its call sites. The harness resumed by declaring `bob.repo.heads()` instead. That is the defect — not the sync path, but the fact that `have` accepted any `Vec<Oid>` and the obvious thing to reach for was the wrong one. `Repo::heads`' own doc said "what a peer passes as have", so the trait was teaching it. `loot clone` was doing it too, correct only because a freshly inited repo has no heads. What a peer may declare is now `Have`, and `negotiation_have()` is the only thing that makes one — the #217 filter is the check the type certifies. `Have::nothing()` is the one other constructor, for transports probing a relay and clients with no repo to ask yet; declaring less can only over-send, and over-declaring is the strandable direction. Threaded through the receiver-declares half only: SyncTransport, loot_net::{offer,fetch,pull} and the forge's signed twins. The sender side keeps `&[Oid]` deliberately. `have` means one thing in both directions — what the recipient of the bundle holds — so there is no second concept to name; what differs is provenance, and a type cannot carry a guarantee across a network. Wrapping it would advertise a check that does not happen. That reasoning lives on `Have`'s doc, which is the only place it is written. Candidate 1 from the ticket — refuse to advance the head over an incomplete closure — is not built, because ADR 0024 already priced and rejected it under "cross-batch atomicity is deliberately not provided". A confirmation note says so there, so the next reader does not re-derive it. The new `tests/sync_resume.rs` asserts the head advance rather than treating it as the failure, and covers the fault the suite genuinely missed: a bundle that is short but valid, where every batch succeeds, the pull returns Ok, and the operator is told it worked while holding half the files. The next pull heals it, which is what is pinned. Acceptance criterion 3 ("am I up to date" must answer no while any object is absent) is deliberately not built: `closure_complete` is unsatisfiable on the forge path, where a reader legitimately never receives ciphertext it holds no grant for, so the warning would fire forever on every forge repo with restricted content. That is #803. `an_interrupted_transfer_resumes_to_convergence` runs with its ignore deleted. 271dd5cf · dbf3dbe6…diff
  • the relay's grant mailbox authorizes before it parses, and a read addresses only the caller's own (#621) 4b349b72 · dbf3dbe6…diff
  • the reader names its own holes: the completeness filter and Have retire, and pull reports what never arrived (#803) f15d576e · dbf3dbe6…diff
  • info names the build, not only the wire format: a deploy becomes verifiable from outside (#922) ffe01788 · dbf3dbe6…diff
  • custody at rest seals to your own key behind an optional passphrase, unlock is a session file or an env var, and no non-interactive caller starts prompting (#1138) c8ffee3b · dbf3dbe6…diff
  • a flags value stops being read as a flag, because `FlagSpec::given` asks in flag position the way `positionals` already does and every verb-local scan in both binaries is deleted behind a census that refuses the shape — which is what had `loot tag -m "-d"` signing a retirement, `loot describe -m "--no-snapshot"` silently skipping the capture, and `loot-first land --allow-publish "--skip-tests"` skipping the gate that is its whole job (#1612) b40e1843 · dbf3dbe6…diff
  • twenty-one verbs stop accepting a positional they silently DROP, and the two that keep it now say WHY rather than looking like debt: each of the twenty-three the census named was read HANDLER-FIRST rather than swept, because narrowing a verb whose arm actually reads a positional turns a silent drop into a WRONG REFUSAL, which is worse than the bug - nine ignore argv entirely, twelve read it only through their own FlagSpec, and two were followed into a helper, RelayKeys::from_args for serve and resume::mode for squash. describe and new stay exempt on a PERMANENT reason now recorded at the exemption: their #545 refusal inspects the stray token to say it is the tail of a -m subject an unescaping shell split, and the door gate runs BEFORE the handler, so declaring an arity would REPLACE that message rather than add a refusal - verified live, describe with a split subject still exits 1 carrying the full #545 text. the second census is not fed twenty-one new names, because appending them is the edit that turns a census into a list nobody reads: its zero-arity half is now DERIVED from USAGE by the same reader the first census uses, and heads, gates and count-objects came OFF the hand-written list, since the three paragraphs arguing them argued the thing that is now the general rule. the exemption is hoisted to one shared constant so it cannot be lifted in one census and left standing in the other. the new behaviour pin derives BOTH sides from independent sources - expected from USAGE prose, observed from live refusal calls - and takes exactly one junk token so cat, tag and merge stay out of the set. the ticket comment asking for a handler-side census is STALE and nothing was built: that census already exists in two places, and rather than trusting it, it was proved against the comment own instances by RECONSTRUCTING them - the hand-rolled positional filter in cat red at 0 passed 1 failed naming cat.rs:148, and the #1494 by-one flag skip red naming main.rs:1229. the one half of that comment that is NOT honestly buildable is named as such: a check that hand-written flag names never appear outside flags.rs could only exist with an allowlist of every legitimate flag literal, which is the hand-maintained-list-asserted-complete class, and the real defect in that instance was the hand-rolled skipping the existing clause already catches. six mutations with counts read, and the caller-visible change is stated rather than buried - a stray word now exits 1 for all twenty-one where it used to report success, with crates, sdk, tools, docs, site and the skills all grepped for an invocation that would start failing and NONE found (#1569) 62a8941d · dbf3dbe6…diff
  • the shorthand whose NAME states the path axis while its SHAPE states the arity axis is DELETED, so the terse spelling is now the one that REFUSES - which was this ticket whole thesis, that the wrong declaration was cheaper to write than the right one and that is why the silent-drop class kept recurring. every site that meant it now types the open constructor out, and the only shorthand left is the one that takes nothing. option A beat option B on BOTH axes, measured rather than preferred: B would have changed the constructor signature, so EVERY open call site owed a reason string - including the path-taking and the genuinely variadic ones - and the two dozen dispatch verbs would each have written the SAME sentence, which is boilerplate that teaches nothing and is itself a hand-maintained population. so A has the smaller blast radius AND the stronger property. the blast radius is ZERO BEHAVIOURAL, because the retired constant was literally that expression: no verb declared arity, no slot kind and no refusal moved - thirty-five declaration sites, eleven imports and about twenty-five prose sites, with the workspace check clean and no new warnings. the exemption list was ALREADY down to its two legitimate names before this began, since #1569 narrowed the other twenty-one hours earlier, so nothing was added to it or taken from it, and the #545 refusal that earns those two their place is untouched by construction - pinned rather than incidental, because the mutation that hands one of them the no-arguments declaration reddens all three censuses. the rename then exposed two more counts standing beside sets that MOVE, and both are fixed rather than carried: a fixture doc claiming all FOUR verbs it exists to serve are exactly this shape, where there are FIVE production attachers and NONE of them is that shape, and a line naming the four verbs that used the retired constant. both now state the rule and count nothing. the new guard refuses BINDING the zero-slot open claim to a name, which is the single edit that would undo this, while deliberately NOT refusing a leaf that spells the claim out at its own spec - the two told apart by what PRECEDES the constructor, with both run through the predicate before its answer is read. its limits are in its own header. and the control that mattered is the second: with the comment-strip removed AND the predicate control disabled, the tree scan names the flags file itself, over the retired declaration QUOTED INSIDE THE SURVIVING CONSTANT OWN DOC - so the strip is load-bearing rather than decorative. the first and third mutations are each other discrimination, one reddening only the tree arm and the other only the binding-versus-spelling arm, and the fourth proves the floor fires at zero files rather than agreeing silently (#1675) 123fdbd4 · dbf3dbe6…diff
  • the readiness wait stops being a wall-clock BUDGET over a polled directory and waits on the child OWN first line instead - a strictly stronger condition, because the banner is printed AFTER the signal handler is armed while the temp tree appears EARLIER, in sandbox create. so the directory only ever proved the run had STARTED, and a 500ms sleep stood in for and-by-now-it-is-probably-armed: signalling inside that sliver tests the GAP rather than the fix, which is why the wait was load-bearing and is REPLACED here rather than deleted. the banner is a pub const so the test waits on the VALUE rather than on a copy of the sentence, and the ordering it depends on is PINNED - and that pin is shown load-bearing rather than decorative, because moving the banner above the arming leaves the very test it protects GREEN on an idle machine. the damage would have been an INTERMITTENTLY red test, not an obviously broken one. the measurement behind all of this was REDONE rather than relayed, because the tree it was supposedly taken on DID NOT COMPILE - probes whose definitions had been deleted and whose uses were left behind - so nothing about it had ever been built, let alone run. 534 loaded runs against 12 idle, the test binary invoked DIRECTLY rather than through cargo so no rebuild could contend, under up to three concurrent cold workspace builds at 100% CPU. the correction is MATERIAL: the worst whole-test reading goes from 22.75 to 61.4 seconds, 2.7 times worse, and signal-to-exit from 18.3 to 29.8, 1.6 times worse - while the IDLE column reconciles exactly, which is what says the earlier figures sampled a quieter machine rather than a different test. two findings come out better than the ones they replace. the old 30-second budget is not marginal but EXCEEDED OUTRIGHT: three of 534 readiness readings blew past it at 61.3, 60.4 and 50.7 seconds, a 0.6 percent outright loss, reproduced rather than inferred. and the sibling one assertion below it was 215 MILLISECONDS short of being the same bug, at 29.8 against its own 30. so both clocks are re-derived as BACKSTOPS rather than budgets, and deliberately to the SAME number, because the measurement shows a machine that intermittently stops scheduling this child for tens of seconds and which slice a given stall lands in is LUCK - sizing each against only its own sample understates both by exactly the amount that sample under-sampled. the budgets-versus-backstops distinction is stated once for both: a budget is sized to how long the work ought to take and is therefore a claim about the machine, while a backstop is sized to nothing, exists only for states where no progress will ever be made, and must be far enough out that crossing it says WEDGED and never BUSY. the sibling sweep is recorded in the file so it is not redone from zero, and it was READ rather than line-window grepped - the rust suite comes out clean, every other bounded wait being over an in-process thread already awaited on a condition, or a LOWER bound, or iteration-bounded, or slack over a kill rather than a cold start. and one loaded run of the 534 failed UNEXPLAINED, in 0.48 seconds so not a clock at all, before the harness captured panic text, never recurring in the 510 that followed with capture on. it is recorded as what it is: a SECOND load-sensitive failure mode in this test, which this change does not close and must not be read as having closed (#1693) 0d517bfe · dbf3dbe6…diff
  • a verb arm now receives the argv door answer instead of the raw slice: VerbRun takes an Admitted value, the rebased tail bound to the spec of the row it was dispatched from, and its readers are the only way in, so argv[0] or argv.first() in an arm fails to compile (both planted, read as E0608 and E0599). spec_of is test-only and its 104 production lookups read through the admitted spec; six of the seven raw-index arms (bundle, grant-status, embargo-status, attest, resolve, completions) read positionals through the door and relay reads its leading word through a named exception; subcommand families resolve their leaf into a new Admitted, and bisect and buoy are handed one ahead of the table. the two named exceptions, leading_word for relay and bisect and pass_through_tail for the bisect run command, plus the one process argv read, are held to a named set of functions by a new census that went red on a planted leading_word read in cmd_bundle, and the source walker consumer header now counts it. refusals and output are unchanged by every suite and by a read of each migrated arm, with one exception found on the way: resolve with a trailing --tool and no command read --tool as the file and now refuses with the usage line, pinned by a new test. CONTEXT.md gains the Admitted argv term; loot-first keeps its own spec_of and DECLARED_READS is untouched (#1929) d92e95f2 · dbf3dbe6…diff
  • the tutorial interrupt handler reports what the removal did instead of that it reached the line, asks again when a concurrent writer takes the first ask, and the interrupt test pins the message against the filesystem rather than the tree alone. arm_signal_cleanup discarded the result of remove_dir_all and then printed the removed line regardless, so that line was a report of reaching that point over a tree that is where the private keys of both demo identities and the decrypted .env live (#513): the count-attempted-vs-done class in operator-facing output, and why Test - landed main went red five times through the 2026-09-16 run with the removed line and exit 130 both passing above the assertion that failed. the CI failure itself is NOT reproduced here and is not claimed to be, since that path is the linux runner, so what is measured on this windows desktop is the mechanism and the decision. a throwaway probe made remove_dir_all fail under a concurrent writer with DirectoryNotEmpty (os error 145), the windows spelling of the ENOTEMPTY the ticket reasons about: one attempt left the tree behind in 33 of 400 rounds at a 50 write burst and in 299 of 300 at 200 writes, three attempts 50ms apart left it behind in 0 of 200 and 0 of 300, and a writer that never stops defeated every attempt count measured, which is why the failure line exists rather than a fallback nobody expects to see and why both constants are the values they are. that table is recorded on SWEEP_ATTEMPTS as a measurement rather than as something re-derivable from the source. sweep_interrupted_tree takes its removal as a parameter because the handler ends in std::process::exit and cannot be called from a test at all, so the arm that reports a failure is reachable there and nowhere else; the failure line names the path, the error and that a later run reaps it, in the register of the note the handler already prints when it cannot arm, and writeln! over println! plus the discarded results after the report are untouched. red first, both ways: the discarded result put back reddens the refusal pin (8 passed, 1 failed, printing the removed line over a tree nothing removed), the attempt count at one reddens the retry pin and the real-writer pin (7 passed, 2 failed, the second naming os error 145 under a live writer, and 10 of 10 red run alone), and through the integration test, the handler removal forced to fail reddens it naming the refusal in the words of the handler (2 passed, 1 failed) while that mutation plus the pre-fix reporting reddens it naming a removal line over a tree still there (2 passed, 1 failed), which is the CI shape reached deliberately on windows. the real-writer pin stops its writer on the first attempt rather than after a fixed burst, because the burst version outlasted the sweep inside a full workspace run and went red, the load-sensitivity of #1693; it therefore does not guard the spacing, which is stated on SWEEP_SPACING and rests on the probe, with the spacing at zero measured green 5 of 5. the pre-interrupt tree.exists vacuity guard stays, and it is what makes the CI reading trustworthy. no migration, and nothing outside the tutorial verb moves, so this owes no deploy. the workspace suite is green over two consecutive runs (3863 passed over 119 binaries, 7 ignored) (#2037) 413891ed · dbf3dbe6…diff
  • sweep 1 fix-up over #1826, #1837 and #1839: a live change only a superseded head reaches is listed in the fork view, in a third section of its own, rather than in no section at all. LogGraph::retain_heads leaves such a change with an empty reachable_from, and history() partitioned the fork on exactly one head and more than one, so after a move --onto the ancestor the old tip alone reaches was printed nowhere - reproduced first through the spawned binary with two live lines (0 passed, 1 failed), the fork and the non-empty superseded head both holding as controls. GraphHistory gains unreached, the renderer prints it under behind a superseded tip after the shared ancestry, drawn_rows leads with it because such a change can only be a child of a lane or shared row, the path filter, retain_versions and all_rows walk it, and both machine shapes carry the row with no new column. HEAD on an untracked position with no working change now counts the heads Liveness::is_superseded rejects and answers the sole counted head by name, because Position::anchor answers the first graph head, which can be the superseded one; measured at the other two sites the ticket named, propose already reads is_live and IntegrationPreview deliberately counts the whole partition with retire for the superseded ones, so the liveness doc now points at the callers of the predicate rather than listing two readers. the move --onto usage line gets its space back; refit_shape spells its path columns through treepath::store_key with a backslash pin, and the #2033 census records the tree-path axis it is blind to by design; the shallow clause has one spelling, workspace::parents_not_held, read by the notice and the push refusal, with the pin the suite lacked; carried is carried_count, Reanchored.change is change_id, the squash and absorb op-log lines say re-anchored, frontier_beyond_the_host is private, the one-flag-member sentences drop one, ADR 0089 names both readers of .loot/shallow and both frontier spellings, and the one raw exit ADR 0089 rests on is held to one by a census in tutorial.rs. own > 0 for the move --onto stale head is pinned off the loot heads row. red first, six mutations in one round over disjoint pins: the unreached filter blinded, drawn_rows reordered, the HEAD filter blinded, store_key undone and a second raw exit added redden five pins with the sync shallow control green (1 passed, 5 failed) and the spawned fork pin (2 passed, 1 failed); the noun-verb swap survived tests/shallow (10 passed, 0 failed), which is why the clause has a pin now (0 passed, 1 failed under the swap). ADR 0066 keeps its gated 28 and points at the gate instead of at tickets. no migration, no wire or format byte moves, and no forge or relay byte moves, so this owes no deploy. the workspace suite is green (3895 passed over 122 binaries, 7 ignored) (#2046) 0b55a20f · dbf3dbe6…diff
  • the second failure mode in the tutorial interrupt test stops being uncharacterized, because a message for it already existed in main CI and what it shows is a handler reporting a CALL rather than a PATH: run 35373927304 on 5e66658 went red on ubuntu-latest in 0.24 seconds with the interrupted - removed line on stdout and that path still on disk, at the agreement assertion, on a head that already carried the #2037 fix - so the change read as closing this did not, and the two sightings the ticket comment carries are the pre-#2037 assertion and are the defect #2037 named. what is established is the disagreement and nothing past it: why remove_dir_all answered success is NOT known and is not written down as if it were. so sweep_interrupted_tree asks the filesystem after a removal reports success and prints the refusal when the path is still there or cannot be read, which is the property #2037 asserted and did not reach, and the interrupt test says what a surviving tree held instead of printing true. THE SATURATION HALF IS A NEGATIVE RESULT STATED WITH ITS COUNT: 150 runs with capture on from the first, under up to four concurrent workspace builds at -j 6 over a scratch copy, against 12 idle, none failed, plus 300 more under a load generator discarded for measuring 7.9 percent busy while it spent its wall clock deleting a 16 GB target directory. the load that did run was bursty rather than sustained and the file says so, a median of 3.6 percent against a peak of 99.8, while the spread moved from 0.38 to 0.44 seconds idle to 0.48 to 126.4 loaded - and none in 450 does not retire one in 534, which is recorded too. two smaller corrections ride along, both read off runs: the fixture behind a tree already gone reports as removed answered NotFound over a directory it had left standing, so it pinned the mapping and never the filesystem, and the sentence saying the swept sandbox holds one heartbeat file missed the empty alice directory that walk mints ahead of its first prompt. workflow.md gains the shape its own falsifier asked to be told about, a test that fails at a closing assertion because the process it drove reported the state that assertion checks. red under mutation, counts read each time: the filesystem confirmation deleted failed the new pin (10 passed and 1 failed, the removal line over a tree still there), the old fixture restored failed the already-gone pin (10 passed and 1 failed, the refusal naming the path), and through the integration test a handler whose removal does nothing failed it naming the remnant as still there holding alice and heartbeat (2 passed and 1 failed), each restored to 11 passed and to 3 passed. no migration, no wire or format byte moves and no host behaviour moves, so this owes no deploy. the workspace suite is green (4179 passed over 133 binaries, 9 ignored) (#1916) 2c05fdc7 · dbf3dbe6…diff
  • the tutorial interrupt red #1916 read as a removal that lied is a tree made again after the sweep: on the linux runner std remove_dir_all answers success only once the root is gone, the captured transcript prints the first prompt ahead of the handler line, and walk, still running on the main thread beside the handler, opened with a create_dir_all over alice that minted the root back before ask beat the heartbeat into it. two delays injected into that sequencing reproduced the red and its alice, heartbeat remnant on this desktop with confirm_gone in place, so that check alone would not have closed it; Sandbox::create now makes alice before the handler is armed, the same two delays pass, and a unit pin drives the sweep, the walk and the beat in that order. what stays open is said at the fix: other writers, the relay thread and the loot subprocesses among them, can still put a path back mid-step. the CI run recorded the two readings and not the sequencing, so the mechanism is established by reading and by the reproduction rather than observed there, and workflow.md stops calling the report and the look one moment. the loot-s3 client keeps its 60 s budget for want of any measured rate to its bucket, but a request that runs out now names it and what it covers, where reqwest said error sending request or error decoding response body with no word of a deadline. the sdk doc stops claiming the native policy: the formula is copied, native allows the send budget between answer chunks where the sdk allows idleMs, the rounding differs, wire.rs now points back at the copy, and the unit test reads the floor from its constant. smaller: the engine.rs verdict compares the band against the band, the measure.rs refusals state a property instead of counting callers, the fixture generator import note sits at the import, and transportFailure takes a role rather than a string. red under mutation, counts read each time: create_dir_all put back in walk (11 passed and 1 failed, holding alice and heartbeat), the s3 timeout naming removed (12 passed and 2 failed), the sdk upload rounded down (6 passed and 1 failed), each restored to 12, 14 and 7 passed. no migration and no wire or format byte moves; the forge and relay deployables word a timed out object store request differently once next deployed, and no code in the tree matches on that text, so this owes no deploy. the workspace suite is green (4192 passed over 133 binaries, 9 ignored) and the sdk suite is green (137 passed over 13 files) (#2254) bdeb6a0c · dbf3dbe6…diff
  • the tutorial interrupt handler halts the writers the tutorial started before it sweeps the tree: a step loot subprocess is spawned, registered and reaped under a lock the handler takes and never releases, so the handler kills and reaps it and the walk blocks at the lock rather than fail its step and exit beside the handler, and the relay thread runs under loot_net::serve_until, a new stop that closes the listener and lets the requests in flight finish, which the handler asks for and waits on within 2 s. reproduced on Windows before the fix: with nothing injected, 7 of 15 runs interrupted as the clone started ended wrong (exit 1 with no handler line, a refusal, or the removal line over a tree holding config/loot/telemetry, which a loot process writes through create_dir_all), and 15 of 15 ended right after it; the relay thread held by temporary sleeps in its start-up or in a stow across a held handler put the relay store back under the removal line 5 of 5 each, right after; a subprocess in a process group of its own, standing in for kill -INT on unix, held the tree 5 of 5, right after. the halt adds under a millisecond at an idle prompt. serve_on, and so loot serve, keeps plain axum::serve. pinned by an interrupt mid-clone over three concurrent runs, a relay halt that leaves nothing serving, and a halt that ends a subprocess nothing signals. red under mutation, counts read each time: the handler without its claim and halt (6 of 6 runs red, 15 of 18 inner runs wrong), the relay started without a stop (0 passed and 1 failed), the halt skipping the relay (0 and 1), the halt without its kill (0 and 1), the holder name selecting nothing (0 and 1), each restored to green. no migration, no format byte and no published wording moves, so this owes no deploy. the workspace suite is green (4397 passed over 138 binaries, 13 ignored) (#2311) f4a9172d · dbf3dbe6…diff
  • the review-sweep fix-up over #2308, #2310, #2311, #2312 and #2313. the lock note beside a failed test is said only on a Windows land: loot-hygiene failed_tests now takes whether the run was on Windows, since os error 5 and 32 are an I/O error and a broken pipe on macOS and Linux, and loot-first passes cfg!(windows); both answers are pinned on this host, red under mutation with counts read each time (recognised everywhere 2 passed and 1 failed, nowhere 0 and 3, loot-first passing false 1 and 4). the plain pre-land test finding now prints the re-run-first recovery the merged pass prints, for each gate row that runs programs and rides the merged pass, derived from the row and pinned whole (no triage 3 and 2, ignoring the merged pass or the row judgement 4 and 1 each, the order swapped 4 and 1). the timing line noun is a ServerKind enum whose relay and forge lines are pinned byte for byte (a misspelled noun 7 and 1), and the loot-s3 put refusal calls the idle duration the idle budget and keeps floor for the rate (the old word 18 and 1). tutorial.rs qualifies the #2311 halt as run on Windows and reasoned elsewhere, and a reap failure no longer prints could not run; ADR 0075 names the graph read by MetadataStore::repo_change_graph and its callers rather than a list that missed propose::admit; sync.rs states the store property the scoped forge offer rests on and what would break it, and its round-zero comments speak of the remote; land-change SKILL.md, workflow.md and ADR 0055 carry the re-run-first order and the Windows-only note. the (idle, uplink_floor) data clump in loot-s3 is left as it is. no migration, format byte or wire byte moves; the loot-first change is live once the primary release binaries are rebuilt. the workspace suite is green (4406 passed over 139 binaries, 13 ignored) (#2348) 77d9c94c · dbf3dbe6…diff

Renames are not followed. loot's tree maps a path to an address, so a rename is a delete and an add. This list is the history of the name, not of the bytes.