carlos / platform Public

provision: census for Task 9: twelve accepted-legacy console units (the timing marks and move_timings, the estimate's medians, the events' reads and dead-letter, the health and reason statements, the status door's ?log=1), five re-pinned in place, the console envelope and the seal; no record write

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 777a4d42f97970aa20f065f3235acec7b923e9ba parent 587a797
4 files changed, +54 −12
  • docs/superpowers/notes/census-proposal-self-serve-moves-2.md +2 −0
  • internal/provision/plan14_root_reads_test.go +9 −1
  • internal/provision/self_serve_moves2_census_test.go +7 −0
  • internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv +36 −11

CI failed — run details

CI log
=== gate ===
.amadan/test-gate.sh

amadan: step gate failed: signal: terminated

amadan: job failed at step gate — its output is above, not at the tail of this log
diff --git a/docs/superpowers/notes/census-proposal-self-serve-moves-2.md b/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
index 632ecfccd..655e9df15 100644
--- a/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
+++ b/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
@@ -39,3 +39,5 @@ Task 8 (the cut, the abort, the finaliser, paging and the operator return) adds
Also on Task 8's branch: `targetDataPaths` names the raw nested directory through `internal/layout`'s `RawInstanceDir` (the same path; `TestRawInstancesDirectoryIsNamedOnlyHere` failed on CI at `c9822492`), re-pinned in place with its frozen declaration, which moved the seal once before Task 8's own rows.
Task 8 fix round 1 adds no root read, class or task and no record write. The operator return's discovery is now the return index: the return door writes `control/offline-moves/@returns/<region>/<host>/<forward id>.json` (`offlineReturnIndex`, nonrecord, create-only, moved to the newest request if-match), and a box lists only its own region's index once a minute (one LIST per region per box, whatever the number of hosts), reads an indexed forward's open record once (`readOpen`, a key-site; a record it may not answer for cached as a negative), writes its report (`writeReturnReport`, nonrecord, renamed from `answerReturn`'s write) and deletes the index entry if-match; `scanReturns`'s listing of every host's move prefixes is gone. `FinishSelfServeMove`'s statement moved to `finishSelfServeMove` (shared with `YieldSelfServeMove`, the move an operator took over), so its row is removed under a proposed H3 disposition and `finishSelfServeMove` is frozen accepted-legacy; `probeTarget` is re-pinned in place (one transport per target address); the console, host and moves envelopes are re-pinned in place and the seal moves to `7351b869…`. Open records of aborted moves (written before an open that never committed) are left in the bucket: their cleanup is plan 4's.
+
+Task 9 (the estimate, the timings and the events) adds no root read, class or task, and no record write. In the root-read overlay twelve accepted-legacy units are added under `rev3=PROPOSED-self-serve-moves-2`, each frozen with a one-line basis, and none reads a file: the timing marks and `move_timings` (`ssMarkTx`, `Store.MarkSelfServeTiming`, `Store.SelfServeTimings`, `Store.InsertMoveTiming`, `Store.MoveTimings`), the estimate's medians (`Server.estimateRules`, whose sites are the `Open` term, a struct field), the events (`ssRowEventTx`, `Store.SelfServeEvents` and the dead-letter `Store.selfServeEventDeliveryFailed`), `Store.RecordSelfServeHealth` and `Store.SetSelfServeReason` (now transactions with their events, where they used `setSelfServe` before) and the operator status door `Server.handleAPIInstanceOfflineStatus` (its site is the request URL's `Query`, the `?log=1` switch). `Server.estimate`, `Store.AbortSelfServe`, `Store.AdvanceSelfServeToStep`, `Store.ConsumeSelfServeRequest` and `Store.migrateSelfServe` are re-pinned in place with their bases extended (the medians; the events and marks in the change's own transaction; the events' `attempts` column, added idempotently). The internal/console envelope is re-pinned in place, and the seal moves to `16987f09…`. In the record-write inventory nothing changes: the marks, `move_timings`, the events and their delivery are console SQLite only, and the one new bucket access is a read (the advance into landed reads the move's reports through `readOfflineEvidence`, a key-site, for the seal's sizes). `claimWriterReasons` already names `self_serve_events` and `self_serve_timings` as the claims-off pass's writers; `move_timings` is `NonApp` in the store gate and its one writer, the finaliser's timings effect, runs only in that pass, so `TestClaimConsoleMutationInvariant` reaches no new writer.
diff --git a/internal/provision/plan14_root_reads_test.go b/internal/provision/plan14_root_reads_test.go
index 5d5391979..553fe7f0d 100644
--- a/internal/provision/plan14_root_reads_test.go
+++ b/internal/provision/plan14_root_reads_test.go
@@ -1349,7 +1349,15 @@ func TestPlan14RootReadCensus(t *testing.T) {
// finishSelfServeMove (FinishSelfServeMove's statement, shared with
// YieldSelfServeMove; FinishSelfServeMove's row under a proposed H3
// disposition) and re-pins probeTarget in place, which moves it again.
- seal = "7351b8695ac429be6459277bd1209fb494069cbc91f2a30959368adcaa1f2ff1"
+ // Task 9 (the estimate, the timings and the events) adds twelve
+ // accepted-legacy units (the timing marks and move_timings, the
+ // estimate's medians, the events' reads and dead-letter, the health and
+ // reason statements now transactions with their events, and the
+ // operator status door's ?log=1 query), none a file, and re-pins
+ // estimate, AbortSelfServe, AdvanceSelfServeToStep,
+ // ConsumeSelfServeRequest and migrateSelfServe in place, which moves it
+ // once more.
+ seal = "16987f099bede699b0fdfb25d967f9d4a48e91e9a391a6b430cbd8202afddd16"
errs := append(compareRootReads(got, inv), checkRootReadLegacy(inv, seal)...)
errs = append(errs, checkRootReadDeclarations(got, inv)...)
if len(errs) > 0 {
diff --git a/internal/provision/self_serve_moves2_census_test.go b/internal/provision/self_serve_moves2_census_test.go
index a89aacd1a..834606bc8 100644
--- a/internal/provision/self_serve_moves2_census_test.go
+++ b/internal/provision/self_serve_moves2_census_test.go
@@ -164,6 +164,13 @@ package provision
// - authcli.go:Server.registerCLIRoutes stays a key-site and is
// re-pinned: it registers the return door beside the other offline
// doors.
+//
+// Task 9 (the estimate, the timings and the events): no record write is
+// added, made raw or re-pinned. The timing marks, move_timings, the
+// events' attempts and dead-letter and the operator status's ?log=1 are
+// console SQLite only. The one new bucket access is a read: the advance
+// into landed reads the move's reports (readOfflineEvidence, already a
+// key-site) for the seal's sizes.
func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
removed := []struct{ file, unit string }{
{"internal/console/apiinstancemove.go", "Server.handleAPIInstanceMoveRequest"},
diff --git a/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv b/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
index cb0f94155..51b5b1760 100644
--- a/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
+++ b/internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv
@@ -23,7 +23,7 @@ internal/console/templates/settings.html external legacy accepted-legacy accepte
internal/provision/offline_move.go offlineBegin legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=root-input (J4, as OfflineStart); the console (cmd/console serve under console.service, user carlos-console): self-serve moves 1 Task 7's body (OfflineStart's, the state a parameter; a direct start advances move_seq and stamps move.seq, refusing ErrLifetimeExhausted at MaxInt64 before any write), and it now also creates the self-serve move in offline-queued for OfflineQueue (queued_at, staged_at and precheck_at at the caller's stamp, move.seq set to the record's move_seq, no advance) and records return_of; a stage and a queue hold nothing; its one site is still rec.ActiveRun.Open(), a method on the record's run state (RunState.Open), not a file read; self-serve moves 2 Task 2 file:Open@208 0a9b432ddf2f39a977c0651e377258b35c1d05635e9979583eeac6253d6c0ec8
@coverage internal/provision d018e5699137db933be2142f7526d0d1d10b08170525886bd9c424cde5578b55
# Task 3 (per-box reservations with a legacy projection and a sentinel, the fenced reclaim and the operator doors' bound admission), rev3=PROPOSED-self-serve-moves-2: no root read, class or task is added and no accepted-legacy unit is re-pinned, so the seal does not move. The new units (moves.ParseOfflineActive, moves.OfflineActiveBody, the console's offlinereserve.go, the doors' offlineApplyBound and offlineAdvanceBound) read no file: their reads are the bucket's control/offline-moves/active.json and the instance record through the judged readers and fenceRecord. Envelopes re-pinned in place (Task 2's rows replaced): internal/console (offlinereserve.go, the start and stage doors, the Server's two evidence fields) and internal/moves (the reservation table in offline.go).
-@coverage internal/console 4dfa31277b9a3cbbae60c08f01c40d4adce75b1918719a165e05513f75133c73
+@coverage internal/console ae4a1f3937058bf14cf053946321af10ef42abe6bc0d081c230011a4f8522475
@coverage internal/moves 6a61fc2680d29b8998a383c7c65756f78a06ac312279148bdde752546686cd8d
# Task 4 (the journal, the events table, the console lease and the pass skeleton), rev3=PROPOSED-self-serve-moves-2: no root read, class or task is added. The console SQLite journal (selfserve_store.go) adds twenty-two units, each frozen accepted-legacy with a reviewed basis (console SQL as carlos-console, no bucket or root action), and the lease's console name adds one crypto/rand read (Server.selfServeConsoleID); serve (in place: the paging arm takes the store, the pass is started), NewServer (the row evidence and the recovery-mode scan) and Store.migrate (migrateSelfServe) are re-pinned. The seal moves. The lease and the pass read control/offline-moves/console.json and active.json from the bucket, not a file. Envelopes re-pinned in place: cmd/console, internal/console and internal/provision (WithWriteGuard in WriteRecord).
@legacy a8dd51a494ab3cd2ad371ded2850b6d78492569729527ea82cd8dd0f2b418a78 internal/console/selfserve_lease.go Server.selfServeConsoleID legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads crypto/rand once per process for the random console name the self-serve moves lease carries; randomness grants no root authority file:Read@110 3303b18ec5c77ccaf662064801f94276bfe947c31378cc1ecb8c4fe509d5d4d1
@@ -37,8 +37,8 @@ internal/console/selfserve_store.go Store.AdmitSelfServeMove legacy accepted-leg
@legacy c2e1ad98b9e02efa012eee032c98c16b38efbc62b4ba9ff1b52bfb0822762cd2 internal/console/selfserve_store.go Store.AdvanceSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: advances one self-serve row's phase, predicated on the phase, the abort flag and an optional confirmed nonce it consumes, with the phase event in one SQLite transaction; no bucket or root action file:Exec@230 79b0ec7f50cf599f0661de8fbb273db6e20faf7adb95d9f6dd8e459c5a1de41e
@legacy bb4226610c6d82f9c7ca9a79e6e4132ad0150bfa1841fa8db3364c4793c97fbb internal/console/selfserve_store.go Store.ConfirmSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: marks a self-serve request confirmed, predicated on its nonce and unconsumed, unvoided, unconfirmed flags; no bucket or root action file:Exec@221 811edad437cdf69f10bd91c33daa7330bfdf92934ef10c9b7e61ba01b62e4f94
internal/console/selfserve_store.go Store.ConfirmSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: marks a self-serve request confirmed, predicated on its nonce and unconsumed, unvoided, unconfirmed flags; no bucket or root action file:Exec@221 811edad437cdf69f10bd91c33daa7330bfdf92934ef10c9b7e61ba01b62e4f94
-@legacy 95da6de389a580fa5c0802c37d9409f171f34d1b756765ffa962087687aa679b internal/console/selfserve_store.go Store.ConsumeSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: consumes a confirmed self-serve request with the next substep and deadline, predicated on its nonce; no bucket or root action file:Exec@122 56964152a1adc56490a602c9649b40affee2e11b86ee48200721e9e24ca95229
-internal/console/selfserve_store.go Store.ConsumeSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: consumes a confirmed self-serve request with the next substep and deadline, predicated on its nonce; no bucket or root action file:Exec@122 56964152a1adc56490a602c9649b40affee2e11b86ee48200721e9e24ca95229
+@legacy a68001a82e950a2786b2cf460cbdc621b440084eb0936ef9b77c6bd4afd0600c internal/console/selfserve_store.go Store.ConsumeSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: consumes a confirmed self-serve request with the next substep and deadline, predicated on its nonce; no bucket or root action; self-serve moves 2 Task 9: the UPDATE runs in one transaction with the decision's events (ssWithAlso), only when it wins file:Exec@199 8374e93bd9afe919729de068de0a45135e0f111bfeedaa1c555109903b4a8d11
+internal/console/selfserve_store.go Store.ConsumeSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: consumes a confirmed self-serve request with the next substep and deadline, predicated on its nonce; no bucket or root action; self-serve moves 2 Task 9: the UPDATE runs in one transaction with the decision's events (ssWithAlso), only when it wins file:Exec@199 8374e93bd9afe919729de068de0a45135e0f111bfeedaa1c555109903b4a8d11
@legacy 2af004d044f348306bcea936da03941d474ba305eb23a04687947890ad7e8d15 internal/console/selfserve_store.go Store.FinishSelfServeMove legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: records a self-serve row's outcome, consumes its confirmed request and inserts the terminal event in one SQLite transaction, only while the row has no outcome; no bucket or root action; self-serve moves 2 Task 8: the statement also sets phase done and clears open_record_pending, and refuses a row whose request is unconfirmed file:Exec@290,file:QueryRow@922 b8171ea50d77204a37e862edb065384ed466b9ed1191a3b17bf1b536d84ce550
@legacy 888bde94f97959ae38336fc48530f9dd76532faea049743f1f57bee01550a20a internal/console/selfserve_store.go Store.HostHasIssuedRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: counts a host's self-serve rows with an issued request still in flight, for the reservation reclaim rule; no bucket or root action file:QueryRow@96 a0fef5ee78031bafdbebd06f2268011a2f2d4f700c01617d04da596ce40c8c89
internal/console/selfserve_store.go Store.HostHasIssuedRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: counts a host's self-serve rows with an issued request still in flight, for the reservation reclaim rule; no bucket or root action file:QueryRow@96 a0fef5ee78031bafdbebd06f2268011a2f2d4f700c01617d04da596ce40c8c89
@@ -59,8 +59,8 @@ internal/console/selfserve_store.go Store.SetSelfServeExpiry legacy accepted-leg
internal/console/selfserve_store.go Store.UnemittedSelfServeEvents legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: lists undelivered self-serve events from the console SQLite store; no bucket or root action file:Query@94 be88efeaf911708fdc26a7ab288ff49ac04768ce0a657f1107ceb4eb4fd65d2a
@legacy 319506acaa32df215a15bbdbac67c2da01be9ec85c9e06124052397c4665397e internal/console/selfserve_store.go Store.VoidSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: voids an unconfirmed, unconsumed self-serve request, predicated on its nonce; no bucket or root action file:Exec@74 a34f7e295861352741da1c27a13ab5185b4e900eedf597b05c391306d0603c57
internal/console/selfserve_store.go Store.VoidSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: voids an unconfirmed, unconsumed self-serve request, predicated on its nonce; no bucket or root action file:Exec@74 a34f7e295861352741da1c27a13ab5185b4e900eedf597b05c391306d0603c57
-@legacy 5dfb7814df4942c488984e6aa1a0e4872884468c735fb2e5217fe0f19148528c internal/console/selfserve_store.go Store.migrateSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: creates the self-serve journal tables (self_serve_moves with its open-row unique index, self_serve_events, self_serve_timings) and move_timings at unarmed store boot, idempotently; no bucket or root action file:Exec@4602 2738ade2f699608c3878071326acc0140d764ab5d21b036b28faa7add6e30f7b
-internal/console/selfserve_store.go Store.migrateSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: creates the self-serve journal tables (self_serve_moves with its open-row unique index, self_serve_events, self_serve_timings) and move_timings at unarmed store boot, idempotently; no bucket or root action file:Exec@4602 2738ade2f699608c3878071326acc0140d764ab5d21b036b28faa7add6e30f7b
+@legacy 751b7c962a859b4e6e90a8abed8e0166b5e1dfc5f7f20542b73a56595bd7067e internal/console/selfserve_store.go Store.migrateSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: creates the self-serve journal tables (self_serve_moves with its open-row unique index, self_serve_events, self_serve_timings) and move_timings at unarmed store boot, idempotently; no bucket or root action; self-serve moves 2 Task 9: adds self_serve_events.attempts idempotently (ALTER TABLE, a duplicate column tolerated) file:Exec@4602,file:Exec@4800 99afc5640823670ed81c1f33d6f1630e5c92028bf2bea2aa55d679aa6f60f652
+internal/console/selfserve_store.go Store.migrateSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: creates the self-serve journal tables (self_serve_moves with its open-row unique index, self_serve_events, self_serve_timings) and move_timings at unarmed store boot, idempotently; no bucket or root action; self-serve moves 2 Task 9: adds self_serve_events.attempts idempotently (ALTER TABLE, a duplicate column tolerated) file:Exec@4602,file:Exec@4800 99afc5640823670ed81c1f33d6f1630e5c92028bf2bea2aa55d679aa6f60f652
@legacy 8df4dff0cd99a5606cdc1197e88f0039ded580fa3043b7705de91ccf362bf435 internal/console/selfserve_store.go Store.selfServeMoves legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: lists self-serve move rows under a fixed predicate from the console SQLite store; no bucket or root action file:Query@99 3780495187ef409c945d603d2aabe9aeecd02044ba034ee9e349d2f38b551466
internal/console/selfserve_store.go Store.selfServeMoves legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: lists self-serve move rows under a fixed predicate from the console SQLite store; no bucket or root action file:Query@99 3780495187ef409c945d603d2aabe9aeecd02044ba034ee9e349d2f38b551466
@legacy 7696cdcbbb86d8e2adb5e1e896d4def7c4ffe6d62aeea4839f426e74c6f718f6 internal/console/selfserve_store.go Store.selfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads one self-serve row's request columns with cut_requested_at; no bucket or root action file:QueryRow@270 491bb9fe1c4b487f130d3a07c2a840995e408e86d6f8afaa561be57c61442dbb
@@ -160,8 +160,8 @@ internal/console/apiinstancemove_offline.go Server.participantIdentityFor legacy
internal/console/selfserve_door.go Server.selfServeEstimate legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the estimate of a self-serve move not yet requested: reads the request's URL query (region), the console SQLite rows and the prepare's bucket evidence, writes nothing; no file read, no root action; fix round 1: the record checks before the journal read (selfServeOpenRow) file:Query@354 12c7adb0d9d0682fd3ae9ec9f80884cf53899891aa4cd38ce5a0a71eff62c8b4
@legacy 00fcfd1a948069335f118cf07dd757b90d2020fad8caef0719eb75e8d3cc261c internal/console/selfserve_door.go selfServeBusy legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the prepare's record checks; its one site is rec.ActiveRun.Open(), a method of the record already read; no file read, no root action; fix round 1: the open row is checked after it, from the journal file:Open@144 b9949bc89e1ed588d04dbd042d2a3b8a530546b85e05bf6f7fd3daf4d97a47b1
internal/console/selfserve_door.go selfServeBusy legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the prepare's record checks; its one site is rec.ActiveRun.Open(), a method of the record already read; no file read, no root action; fix round 1: the open row is checked after it, from the journal file:Open@144 b9949bc89e1ed588d04dbd042d2a3b8a530546b85e05bf6f7fd3daf4d97a47b1
-@legacy c2b468656ad27a5c0d554d7505e736deb1fe015d9b1e383240f447622f5f16a7 internal/console/selfserve_estimate.go Server.estimate legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: pure arithmetic over byte counts and the default terms; its sites are the estimate's Open term (a struct field named Open); no file read, no root action file:Open@259,file:Open@268,file:Open@356 9ce9332e764cb63574f16926dabf050a1429ceb10ff44b12c02447c08c0e5e09
-internal/console/selfserve_estimate.go Server.estimate legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: pure arithmetic over byte counts and the default terms; its sites are the estimate's Open term (a struct field named Open); no file read, no root action file:Open@259,file:Open@268,file:Open@356 9ce9332e764cb63574f16926dabf050a1429ceb10ff44b12c02447c08c0e5e09
+@legacy 70448bf5407befd2ce8e6199738b27a86597b7ff6fd490e3fd0fb9768061a74d internal/console/selfserve_estimate.go Server.estimate legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: pure arithmetic over byte counts and the default terms; its sites are the estimate's Open term (a struct field named Open); no file read, no root action; self-serve moves 2 Task 9: the terms' rules come from estimateRules (the region pair's medians, else the defaults) file:Open@251,file:Open@260,file:Open@348 914361754b7f03e34ef8bc534ebbe570ae8829b4a1623592c611fe616be01328
+internal/console/selfserve_estimate.go Server.estimate legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: pure arithmetic over byte counts and the default terms; its sites are the estimate's Open term (a struct field named Open); no file read, no root action; self-serve moves 2 Task 9: the terms' rules come from estimateRules (the region pair's medians, else the defaults) file:Open@251,file:Open@260,file:Open@348 914361754b7f03e34ef8bc534ebbe570ae8829b4a1623592c611fe616be01328
@legacy bbf40550e574bbb95012d6a817c3b71917311f71dba4061ddbad785072e61384 internal/console/selfserve_estimate.go type estimateTerms legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: a type declaration whose Open field is the open phase's duration; no file read, no root action file:Open@47 70ba8214af2db2b694d87c83750665856669faabb91359c20d6483503e69f77c
internal/console/selfserve_estimate.go type estimateTerms legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: a type declaration whose Open field is the open phase's duration; no file read, no root action file:Open@47 70ba8214af2db2b694d87c83750665856669faabb91359c20d6483503e69f77c
@legacy e7a1b4b8179de6b4d263f785208f5bad87eaa2ec4ff8eb07876e01f6034002a8 internal/console/selfserve_estimate.go var estimateDefaults legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the estimate's default terms, a literal whose Open field is the open phase's term; no file read, no root action file:Open@247,file:Open@49 e7c598c8e4a4fa1e4df207e463c6fd722f89d0955f896baa439ce328db821849
@@ -175,10 +175,10 @@ internal/console/selfserve_apply.go newRequestNonce legacy accepted-legacy accep
internal/console/selfserve_checks.go targetDataPaths legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: names the instance's data paths under the data directory a target box's ready report uses (/data when the report names none), the fact set the job requires; reads no file and grants nothing (self-serve moves 2: the raw nested directory is named through internal/layout's RawInstanceDir) data-literal@84 71d187d02044fc424ce3e0022dfe9c3ce57315912de5f55053adab316d5fd577
@legacy 3e7ecd729f078de5257e5e19082a91c34057267018b7e58abba3940332cdf896 internal/console/selfserve_job.go selfServePhaseDeadline legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: computes a phase's step deadline from the row's estimate terms (the matched Open is est.Open, the open term, a duration); reads no file file:Open@709 defa48814bd678c1ededf52d12176d2ddddc8a9096f91f1fb94153a6f76146f6
internal/console/selfserve_job.go selfServePhaseDeadline legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: computes a phase's step deadline from the row's estimate terms (the matched Open is est.Open, the open term, a duration); reads no file file:Open@709 defa48814bd678c1ededf52d12176d2ddddc8a9096f91f1fb94153a6f76146f6
-@legacy 9f0761052e7df8711c17427d8d66fde2ae6a36592d59c11ce95963e774202cdf internal/console/selfserve_store.go Store.AbortSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: records the job's own abort decision on one open self-serve row (abort_requested_at, outcome_reason, reason), predicated on no outcome and no abort yet; no bucket or root action file:Exec@207 165d536f9be74472c8f01e9a50b7a97d793c8f5731db091695202fe8eeaa8aeb
-internal/console/selfserve_store.go Store.AbortSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: records the job's own abort decision on one open self-serve row (abort_requested_at, outcome_reason, reason), predicated on no outcome and no abort yet; no bucket or root action file:Exec@207 165d536f9be74472c8f01e9a50b7a97d793c8f5731db091695202fe8eeaa8aeb
-@legacy a94ae18585d7d25c1e71868e1eef0ff3c88eaccac7bc6cd5130ad504c557236a internal/console/selfserve_store.go Store.AdvanceSelfServeToStep legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: AdvanceSelfServe's UPDATE and phase event with the substep a parameter (reconciliation's entry, the cut handoff's adopted or issue) and staging_started_at and next_maintenance_at in the same statement, in one SQLite transaction; no bucket or root action; self-serve moves 2 Task 8: the statement also requires outcome = '' (a finished row is never advanced) file:Exec@344 33ed2690b454b0406194b5cf27f677ebe0381e3e6d55fd27db8203f5904905d7
-internal/console/selfserve_store.go Store.AdvanceSelfServeToStep legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: AdvanceSelfServe's UPDATE and phase event with the substep a parameter (reconciliation's entry, the cut handoff's adopted or issue) and staging_started_at and next_maintenance_at in the same statement, in one SQLite transaction; no bucket or root action; self-serve moves 2 Task 8: the statement also requires outcome = '' (a finished row is never advanced) file:Exec@344 33ed2690b454b0406194b5cf27f677ebe0381e3e6d55fd27db8203f5904905d7
+@legacy 8a58458c808454c9071f4666695616d6408df679b112624a439a252fe28dd85e internal/console/selfserve_store.go Store.AbortSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: records the job's own abort decision on one open self-serve row (abort_requested_at, outcome_reason, reason), predicated on no outcome and no abort yet; no bucket or root action; self-serve moves 2 Task 9: the UPDATE runs in one transaction with its refusal event and the caller's events (ssWithAlso) file:Exec@353 a0906ed4afbb45b4f0630b6ee917a3e11fd2ff4d07a60a2ce49afd923e89fb94
+internal/console/selfserve_store.go Store.AbortSelfServe legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: records the job's own abort decision on one open self-serve row (abort_requested_at, outcome_reason, reason), predicated on no outcome and no abort yet; no bucket or root action; self-serve moves 2 Task 9: the UPDATE runs in one transaction with its refusal event and the caller's events (ssWithAlso) file:Exec@353 a0906ed4afbb45b4f0630b6ee917a3e11fd2ff4d07a60a2ce49afd923e89fb94
+@legacy d555ab86e6603cd297b46c090f8be25a94c770a1cfe4a4f764831fa5928857c3 internal/console/selfserve_store.go Store.AdvanceSelfServeToStep legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: AdvanceSelfServe's UPDATE and phase event with the substep a parameter (reconciliation's entry, the cut handoff's adopted or issue) and staging_started_at and next_maintenance_at in the same statement, in one SQLite transaction; no bucket or root action; self-serve moves 2 Task 8: the statement also requires outcome = '' (a finished row is never advanced); self-serve moves 2 Task 9: the caller's events and timing marks run in the advancing transaction before the phase event, only when the advance wins file:Exec@360 9d9e0258906848a66aa963afe50ac90e02d9553d5b4946bf633a101d8b51641f
+internal/console/selfserve_store.go Store.AdvanceSelfServeToStep legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: AdvanceSelfServe's UPDATE and phase event with the substep a parameter (reconciliation's entry, the cut handoff's adopted or issue) and staging_started_at and next_maintenance_at in the same statement, in one SQLite transaction; no bucket or root action; self-serve moves 2 Task 8: the statement also requires outcome = '' (a finished row is never advanced); self-serve moves 2 Task 9: the caller's events and timing marks run in the advancing transaction before the phase event, only when the advance wins file:Exec@360 9d9e0258906848a66aa963afe50ac90e02d9553d5b4946bf633a101d8b51641f
@legacy 9a71ef08171b8178280d1b13431a58e24c4f5a3a76e7fc752fad223c94e8bdd1 internal/console/selfserve_store.go Store.ConsumeSelfServeMaintenance legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: consumes one confirmed maintenance request back to idle, predicated on its nonce, its confirmation, no consumption and no cut; no bucket or root action file:Exec@119 0617bcf4892edf006203e3395fc30e5efc01d8c5654e63daf47c852dc3cb07c7
internal/console/selfserve_store.go Store.ConsumeSelfServeMaintenance legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: consumes one confirmed maintenance request back to idle, predicated on its nonce, its confirmation, no consumption and no cut; no bucket or root action file:Exec@119 0617bcf4892edf006203e3395fc30e5efc01d8c5654e63daf47c852dc3cb07c7
@legacy f3c0942345fb8194f311733b4eb48773240fbf054b7d7ae5ae2d01dc4fa0d90e internal/console/selfserve_store.go Store.ExpireSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: decides one self-serve request's expiry, predicated on its nonce, the deadline and the cut state the worker read, unconsumed and unexpired; no bucket or root action file:Exec@126 49d1e55948e9b1e8060997cd2bf530cce028d0c3da96e10cdcc1e68048786498
@@ -206,3 +206,28 @@ internal/host/movesoffline_return.go movesWorker.returnLeftovers legacy accepted
@removed internal/console/selfserve_store.go Store.FinishSelfServeMove H3 census-ruling-PROPOSED-self-serve-moves-2;rev3=PROPOSED-self-serve-moves-2;basis=remains declared but has no direct read; its statement moved unchanged to finishSelfServeMove, classified below, which FinishSelfServeMove calls with release_pending 1; proposed removal only
@legacy 5fa093abea94ae2d7bd67ee3221e07eda12402fb56698c6455ad82c75108673e internal/console/selfserve_store.go Store.finishSelfServeMove legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: FinishSelfServeMove's statement moved here unchanged by Task 8 fix round 1, with release_pending set by its two callers (FinishSelfServeMove 1, YieldSelfServeMove 0, a move an operator took over); one predicated UPDATE of the console SQLite journal and its row count; no root input file:Exec@304,file:QueryRow@953 ccdea95c3714d983a25511eeb2801220b96b4dc8a5fe6892e1ec816c3ac33775
internal/console/selfserve_store.go Store.finishSelfServeMove legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: FinishSelfServeMove's statement moved here unchanged by Task 8 fix round 1, with release_pending set by its two callers (FinishSelfServeMove 1, YieldSelfServeMove 0, a move an operator took over); one predicated UPDATE of the console SQLite journal and its row count; no root input file:Exec@304,file:QueryRow@953 ccdea95c3714d983a25511eeb2801220b96b4dc8a5fe6892e1ec816c3ac33775
+# Task 9 (the estimate, the timings and the events), rev3=PROPOSED-self-serve-moves-2: no root read, class or task is added and no record write. Twelve accepted-legacy units are added, each console SQLite or a URL query, none a file: the timing marks and move_timings (ssMarkTx, MarkSelfServeTiming, SelfServeTimings, InsertMoveTiming, MoveTimings), the estimate's medians (estimateRules, whose sites are the Open term), the events (ssRowEventTx, SelfServeEvents, the dead-letter selfServeEventDeliveryFailed), RecordSelfServeHealth and SetSelfServeReason (now transactions with their events) and the operator status door (its ?log=1 query). Server.estimate, Store.AbortSelfServe, Store.AdvanceSelfServeToStep, Store.ConsumeSelfServeRequest and Store.migrateSelfServe are re-pinned in place. The seal moves. The internal/console envelope is re-pinned in place.
+@legacy 990c2a58e7657184add84d7aa4ba65124f5e45b13e68d06918e9a07de08c4b67 internal/console/apiinstancemove_offline.go Server.handleAPIInstanceOfflineStatus legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the operator offline status door; its site is the request URL's Query (the ?log=1 switch for the move's events, self-serve moves 2 Task 9), not a file; it reads the record through offlineGate and the console SQLite journal; no root action file:Query@213 2341180d34b7c3be07f910ab719c9ec40254de662d414c7ba4a4a7feb59b0b40
+internal/console/apiinstancemove_offline.go Server.handleAPIInstanceOfflineStatus legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the operator offline status door; its site is the request URL's Query (the ?log=1 switch for the move's events, self-serve moves 2 Task 9), not a file; it reads the record through offlineGate and the console SQLite journal; no root action file:Query@213 2341180d34b7c3be07f910ab719c9ec40254de662d414c7ba4a4a7feb59b0b40
+@legacy 610946fe48a8f52616660f3906324e42c79fef3a50b8a8720321d0ec3f7ca657 internal/console/selfserve_estimate.go Server.estimateRules legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the estimate's terms refined from the region pair's move_timings medians in the console SQLite; its sites are the Open term (a struct field named Open), not a file; no root action file:Open@1175,file:Open@74 8d9cb059e2e641c9d313e08034839663488651b18b1d99dd091be50bb2b980f6
+internal/console/selfserve_estimate.go Server.estimateRules legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the estimate's terms refined from the region pair's move_timings medians in the console SQLite; its sites are the Open term (a struct field named Open), not a file; no root action file:Open@1175,file:Open@74 8d9cb059e2e641c9d313e08034839663488651b18b1d99dd091be50bb2b980f6
+@legacy 66f14cd5f12b609aa5a53aa4e9c9ca2a6f8de2deb410b7f4841e4145192b6c4e internal/console/selfserve_estimate.go Store.InsertMoveTiming legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: one INSERT ... ON CONFLICT DO NOTHING of a finished move's phase timing into the console SQLite move_timings; no bucket or root action file:Exec@208 cab08b1af56d4130e2c83e77d7324558c1e336edf3aefdc0455fad80d242f886
+internal/console/selfserve_estimate.go Store.InsertMoveTiming legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: one INSERT ... ON CONFLICT DO NOTHING of a finished move's phase timing into the console SQLite move_timings; no bucket or root action file:Exec@208 cab08b1af56d4130e2c83e77d7324558c1e336edf3aefdc0455fad80d242f886
+@legacy 0a99bf6b173528019e217c62566e3e9b7e0f9a0f695c962fa8425ff89977d87d internal/console/selfserve_estimate.go Store.MarkSelfServeTiming legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: one console SQLite transaction that checks the self-serve row exists and inserts its timing mark insert-only (ssMarkTx); no bucket or root action file:QueryRow@210 d67ab8a6b3d3144a9ea18be9d37c7053635cb8f01c2c52368193445ad0ab92db
+internal/console/selfserve_estimate.go Store.MarkSelfServeTiming legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: one console SQLite transaction that checks the self-serve row exists and inserts its timing mark insert-only (ssMarkTx); no bucket or root action file:QueryRow@210 d67ab8a6b3d3144a9ea18be9d37c7053635cb8f01c2c52368193445ad0ab92db
+@legacy 5eca6c14c25b5477a782de5cb2de4142b99a2af0e02729d710b144900040848e internal/console/selfserve_estimate.go Store.MoveTimings legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads the region pair's newest move_timings rows of one phase from the console SQLite for the estimate's medians; no bucket or root action file:Query@117 2e8cfbae053573fcf997e8d05d06ef3b2a3c200e19dda7278dbb5d24a8e902ec
+internal/console/selfserve_estimate.go Store.MoveTimings legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads the region pair's newest move_timings rows of one phase from the console SQLite for the estimate's medians; no bucket or root action file:Query@117 2e8cfbae053573fcf997e8d05d06ef3b2a3c200e19dda7278dbb5d24a8e902ec
+@legacy a7e744a590f3b1b2c98b2f3b295af0174401e4ceff23c352e789db74b97ba4be internal/console/selfserve_estimate.go Store.SelfServeTimings legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads one self-serve row's timing marks from the console SQLite; no bucket or root action file:Query@91 994cc662ff52770f6f54dbc1d89aa51dfb726e68174a797da9ad85d03aed6868
+internal/console/selfserve_estimate.go Store.SelfServeTimings legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads one self-serve row's timing marks from the console SQLite; no bucket or root action file:Query@91 994cc662ff52770f6f54dbc1d89aa51dfb726e68174a797da9ad85d03aed6868
+@legacy f24b99944010633cde8a38a952c9314c189649f432f65c8beb6c06fd23449d49 internal/console/selfserve_estimate.go ssMarkTx legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: inserts a timing mark into self_serve_timings insert-only (ON CONFLICT DO NOTHING) and, only when inserted, its timing event, inside the caller's console SQLite transaction; no bucket or root action file:Exec@114 437d4b8e5753538ece597200a6966104357062eb38c76fea2fabd371ba685882
+internal/console/selfserve_estimate.go ssMarkTx legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: inserts a timing mark into self_serve_timings insert-only (ON CONFLICT DO NOTHING) and, only when inserted, its timing event, inside the caller's console SQLite transaction; no bucket or root action file:Exec@114 437d4b8e5753538ece597200a6966104357062eb38c76fea2fabd371ba685882
+@legacy 410979f7381e4cafd5a5421f6634245f6270bfc0ca375649e47f115438b0a5dd internal/console/selfserve_events.go Store.SelfServeEvents legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads one self-serve row's events, delivered or not, oldest first, from the console SQLite for the operator status's ?log=1; no bucket or root action file:Query@85 fdea52d5fb1d88f49de765326210fc08221499ed754beda52d58b4f2e2bb0fca
+internal/console/selfserve_events.go Store.SelfServeEvents legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads one self-serve row's events, delivered or not, oldest first, from the console SQLite for the operator status's ?log=1; no bucket or root action file:Query@85 fdea52d5fb1d88f49de765326210fc08221499ed754beda52d58b4f2e2bb0fca
+@legacy e20db6358744d98959818125abfdf86dddca87b3f225ca2af08d7b5e6fcd3b11 internal/console/selfserve_events.go Store.selfServeEventDeliveryFailed legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: counts a failed event delivery and at the fifth dead-letters the event (emitted, detail prefixed undeliverable:) in one predicated console SQLite UPDATE, reading emitted back; no bucket or root action file:Exec@196,file:QueryRow@638 b081169849b4320304357c77fdb4aacd6a74c7043b99bfeee33b22f65bb36df7
+internal/console/selfserve_events.go Store.selfServeEventDeliveryFailed legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: counts a failed event delivery and at the fifth dead-letters the event (emitted, detail prefixed undeliverable:) in one predicated console SQLite UPDATE, reading emitted back; no bucket or root action file:Exec@196,file:QueryRow@638 b081169849b4320304357c77fdb4aacd6a74c7043b99bfeee33b22f65bb36df7
+@legacy 4a7bfc12f7114a102dc6a16f54af5fa908459ba05d61936c95cc1361aa17bb08 internal/console/selfserve_events.go ssRowEventTx legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads the self-serve row's phase inside the caller's console SQLite transaction to name a non-phase event; no bucket or root action file:QueryRow@145 0178919c9abe7899ec610cec24880fbe7e8f93b7483f3de4a2d0b534ead8688b
+internal/console/selfserve_events.go ssRowEventTx legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads the self-serve row's phase inside the caller's console SQLite transaction to name a non-phase event; no bucket or root action file:QueryRow@145 0178919c9abe7899ec610cec24880fbe7e8f93b7483f3de4a2d0b534ead8688b
+@legacy d25280e2618dba815899677401dcfe262c5f70fe4a4e1d9602a0685f0e17ae14 internal/console/selfserve_store.go Store.RecordSelfServeHealth legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: counts one health probe on a self-serve row and inserts its health:probe event in one console SQLite transaction (it used setSelfServe before self-serve moves 2 Task 9); no bucket or root action file:Exec@303 920990b6764563c6ee59d29d2df3c865663481fd4c18992af001d66ca5938b42
+internal/console/selfserve_store.go Store.RecordSelfServeHealth legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: counts one health probe on a self-serve row and inserts its health:probe event in one console SQLite transaction (it used setSelfServe before self-serve moves 2 Task 9); no bucket or root action file:Exec@303 920990b6764563c6ee59d29d2df3c865663481fd4c18992af001d66ca5938b42
+@legacy 67af16969da64c16d52ccf335bf04c93b29bed42fb4cd0d75e3f1a8b35358aac internal/console/selfserve_store.go Store.SetSelfServeReason legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads a self-serve row's reason and sets the new one, inserting a waiting event only when it changed, in one console SQLite transaction (it used setSelfServe before self-serve moves 2 Task 9); no bucket or root action file:Exec@398,file:QueryRow@168 2140c1c8be9cd230d807b93778faf146f025b5a1b2a533c935e6ddf9f55eda5b
+internal/console/selfserve_store.go Store.SetSelfServeReason legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads a self-serve row's reason and sets the new one, inserting a waiting event only when it changed, in one console SQLite transaction (it used setSelfServe before self-serve moves 2 Task 9); no bucket or root action file:Exec@398,file:QueryRow@168 2140c1c8be9cd230d807b93778faf146f025b5a1b2a533c935e6ddf9f55eda5b