carlos / platform Public

provision: census rows for Task 7 (PROPOSED-self-serve-moves-2)

Nine accepted-legacy units added (the request nonce, the fact set's data
paths, the phase deadlines, six journal statements); AdvanceSelfServe's
and IssueSelfServeRequest's rows retired under a proposed H3 disposition;
the internal/console envelope re-pinned; the seal moves. The write
inventory adds Server.selfServeRun, a record-writer through
SetRecordMoveAt.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude agent, operated by paul@keymail.dev 37eaf15a80326e34d284340b482065c6d14dc92f parent 48b4bf0
4 files changed, +47 −5
  • docs/superpowers/notes/census-proposal-self-serve-moves-2.md +2 −0
  • internal/provision/plan14_root_reads_test.go +8 −2
  • internal/provision/self_serve_moves2_census_test.go +15 −0
  • internal/provision/testdata/plan14-root-reads-self-serve-moves-2.tsv +22 −3
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 1dfb58d12..42dc96cf4 100644
--- a/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
+++ b/docs/superpowers/notes/census-proposal-self-serve-moves-2.md
@@ -29,3 +29,5 @@ Task 5 (record eligibility, the split start validation, participant pinning, the
Task 5 fix round 1 adds no root read. `selfServeBusy` and `Server.selfServeEstimate` are re-pinned in place in their Task 5 rows: the record's checks (class, run, move) now come before the journal read, which moved into its own helper. Their sites are unchanged in kind, offsets moved. The seal moves to `ad120371…`, and the internal/console envelope is re-pinned in place. The other fixes of the round (operator selections reserve the sentinel outside self-serve mode, admission needs lifetimes on, the facts' order, the cancel of a returning move, and operator status views reading no identity) change no census unit's sites. The record-write inventory is unchanged.
Task 5 fix round 2 adds no root read and moves no seal. `reserveBoxes` now accepts an operator operation's own reservation whatever its keys (entries it no longer wants stay held until the move's release removes every entry of its id; a sentinel it holds covers every box). Its one `Put` of `control/offline-moves/active.json` is unchanged, so in the record-write inventory it stays nonrecord (`sel:Put`) with a new digest. The internal/console root-read envelope is re-pinned in place.
+
+Task 7 (the job from requested to ready, and its reconciliation) adds no root read, class or task. In the root-read overlay nine accepted-legacy units are added under `rev3=PROPOSED-self-serve-moves-2`, each with a reviewed one-line basis, and frozen, so the seal moves: `newRequestNonce` (crypto/rand for a request's nonce, the receipt the job's record write carries), `targetDataPaths` (the `/data` literal of the fact set the job requires of a target's ready report; it reads no file), `selfServePhaseDeadline` (its matched `Open` is `est.Open`, the estimate's open term, a duration) and six console SQLite statements of the journal running as `carlos-console` (`AbortSelfServe`, `AdvanceSelfServeToStep`, `ConsumeSelfServeMaintenance`, `ExpireSelfServeRequest`, `VoidExpiredSelfServeRequest` and `issueSelfServeRequest`). `AdvanceSelfServe` and `IssueSelfServeRequest` remain declared with no direct read (their statements moved unchanged into `AdvanceSelfServeToStep` and `issueSelfServeRequest`, which they call), so their Task 4 rows are removed under a proposed H3 disposition, as Task 10a removed `statusTick`'s. The internal/console envelope is re-pinned in place. The job reads the record only through `observeRecord` and `fenceRecord`, judged under the context's judge (`TestNoUnjudgedRecordReads` stays green). In the record-write inventory `Server.selfServeRun` is added as a record-writer (`key:SetRecordMoveAt`): every transition the job writes (the queue, queued-to-staging, the restages and maintenance rounds, the precheck, the estimate, the abort, the queued abort and the abort's finish) is one `SetRecordMoveAt` bound to the incarnation and record_seq persisted with the request, under the lease's write context. Paul's ruling is still outstanding.
diff --git a/internal/provision/plan14_root_reads_test.go b/internal/provision/plan14_root_reads_test.go
index 5a10c596c..3bd0b655f 100644
--- a/internal/provision/plan14_root_reads_test.go
+++ b/internal/provision/plan14_root_reads_test.go
@@ -1328,8 +1328,14 @@ func TestPlan14RootReadCensus(t *testing.T) {
// re-pins four (the poll door, offlineClaimEvidence and two journal
// methods), which moves it once more. Its fix round 1 re-pins two of
// those rows in place (the record checks before the journal read),
- // which moves it again.
- seal = "ad1203719d20e86b2f745aa31c411afc6f4a90e579a2f8cab074598177610715"
+ // which moves it again. Task 7 (the job from requested to ready) adds
+ // nine accepted-legacy units (the request nonce, the fact set's data
+ // paths, the phase deadlines and six journal statements) and retires
+ // AdvanceSelfServe's and IssueSelfServeRequest's rows under a proposed
+ // H3 disposition (their statements moved unchanged into
+ // AdvanceSelfServeToStep and issueSelfServeRequest), which moves it once
+ // more.
+ seal = "78da0561aeb2076952e497706bbc32e421a0a4388937115863a388af053dc24f"
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 5c26224e1..e54f4ef5c 100644
--- a/internal/provision/self_serve_moves2_census_test.go
+++ b/internal/provision/self_serve_moves2_census_test.go
@@ -114,6 +114,19 @@ package provision
// - e2e_bridge.go:const sealPrefix is added, reference (lit:instances):
// the data buckets' hibernate prefix, never a record key or prefix (its
// own declaration since fix round 1, so the census names it stably).
+//
+// Task 7 (the job from requested to ready, and its reconciliation): one
+// record writer is added, none raw.
+// - selfserve_apply.go:Server.selfServeRun is added, a record-writer
+// (key:SetRecordMoveAt): every record transition the job writes (the
+// queue, queued-to-staging, the restages and maintenance rounds, the
+// precheck, the estimate, the abort, OfflineAbortAt and the abort's
+// finish) is one SetRecordMoveAt bound to the incarnation and
+// record_seq persisted with the request, under the lease's write
+// context (selfServeWriteCtx: the lease's deadline and the write
+// guard). The job's fence goes through fenceRecord (lifetimes_create.go,
+// unchanged), and the reservations through reserveBoxes and
+// releaseBoxes (unchanged).
func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
removed := []struct{ file, unit string }{
{"internal/console/apiinstancemove.go", "Server.handleAPIInstanceMoveRequest"},
@@ -155,6 +168,8 @@ func plan14SelfServeMoves2WriteCensusInventory() []censusEntry {
{"internal/host/e2e_bridge.go", "landWorld.bundle", "nonrecord", "sel:PutReplace", "12709f3adcf8026a89c1371d6d9002732667ffa16954790a1765d80b45387022"},
{"internal/host/e2e_bridge.go", "sealWorld.arm", "testsupport", "sel:Put", "501199f1f33a0539bb0e97782f87f7e8fd8b2fe345530881670e6cfb0423709f"},
{"internal/host/e2e_bridge.go", "const sealPrefix", "reference", "lit:instances", "c78134a7cd1306c1655db52559840e9e94956991b4a83d27521801fa85ad566c"},
+ // Task 7: the job's one record write, every transition through it.
+ {"internal/console/selfserve_apply.go", "Server.selfServeRun", "record-writer", "key:SetRecordMoveAt", "748c29c143e8bba836a9ba5fcf11db3170b12e54450ae6931449900f663dc2bb"},
}
entries := plan14SelfServeMoves1WriteCensusInventory()
for _, r := range removed {
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 620c11d16..fa2736277 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 42588b9f64803b41c4463efb31e69fda0fc66573efd5d6a2d6e709682eeca385
# 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 bd5130702807fc15a9f66a7b41d00edc022a6088d96780ff5f140b26b37c0816
+@coverage internal/console 02de4303cae08253409c954948edd85be6ac28e3526ed1739df2611e2ac59c49
@coverage internal/moves 6a68b01ef865d9356bb19971f4cd4a61f7694769b63cee1d8234f615d5e9c8ba
# 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
@@ -35,7 +35,6 @@ internal/console/selfserve_store.go Store.AbandonSelfServeRequest legacy accepte
@legacy 9d1653197c79a78622db26b8520c63ab1754ce9d8086a8b7db7b0c8ac6a33470 internal/console/selfserve_store.go Store.AdmitSelfServeMove legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: inserts one self-serve move row and its first phase event in one SQLite transaction, or reads the instance's open row back; no bucket or root action; self-serve moves 2 Task 5: the row also stores the estimate (estimate_seconds, estimate_terms) the request door computed file:Exec@808,file:QueryRow@1580 121e398e82839b2894fd7a3db441b554269196c57af943b0502ce8552c07671d
internal/console/selfserve_store.go Store.AdmitSelfServeMove legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: inserts one self-serve move row and its first phase event in one SQLite transaction, or reads the instance's open row back; no bucket or root action; self-serve moves 2 Task 5: the row also stores the estimate (estimate_seconds, estimate_terms) the request door computed file:Exec@808,file:QueryRow@1580 121e398e82839b2894fd7a3db441b554269196c57af943b0502ce8552c07671d
@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
-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
@@ -45,7 +44,6 @@ internal/console/selfserve_store.go Store.FinishSelfServeMove legacy accepted-le
@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
@legacy 09a6b77755e93a3002743007c6689309f6c40cd5308c15da53cfbc7dae6e2c7e internal/console/selfserve_store.go Store.IssueSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: persists one request on a self-serve row, predicated on its phase, no outcome and no unconsumed request; no bucket or root action file:Exec@541 39cee79531f56be7080e0e8a030d7913a19554034b19118050d7a55ecb249e86
-internal/console/selfserve_store.go Store.IssueSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: persists one request on a self-serve row, predicated on its phase, no outcome and no unconsumed request; no bucket or root action file:Exec@541 39cee79531f56be7080e0e8a030d7913a19554034b19118050d7a55ecb249e86
@legacy ddf0838225e17f4c4c292464b21b1690f716b7ec626987047be1776e377974e8 internal/console/selfserve_store.go Store.MarkSelfServeCut legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the cut door's one write: marks a ready self-serve row cut, predicated on no abort, cut or expiry; no bucket or root action file:Exec@222 d887f36b2630a505cad973beb413d26c6234a54ef18a1671c313387de766141f
internal/console/selfserve_store.go Store.MarkSelfServeCut legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: the cut door's one write: marks a ready self-serve row cut, predicated on no abort, cut or expiry; no bucket or root action file:Exec@222 d887f36b2630a505cad973beb413d26c6234a54ef18a1671c313387de766141f
@legacy 5eb8d1adda16992f46c5e9ff1e029e266ecdb7f3adc147a90f737c5c1f936dd5 internal/console/selfserve_store.go Store.MoveTerminalOrAbsent 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 outcome and release flag for the reservation reclaim rule; no bucket or root action file:QueryRow@111 7d2f7eacc22eeb69b8a95ef146a472a915dc3c1a143d75fb4eb87e11786f6a13
@@ -171,3 +169,24 @@ internal/console/selfserve_estimate.go type estimateTerms legacy accepted-legacy
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
# Task 5 fix round 1, rev3=PROPOSED-self-serve-moves-2: selfServeBusy and Server.selfServeEstimate are re-pinned in place in their Task 5 rows (the record checks come before the journal read); no root read is added. The internal/console envelope is re-pinned in place. The seal moves.
# Task 5 fix round 2, rev3=PROPOSED-self-serve-moves-2: reserveBoxes accepts an operator operation's own reservation whatever its keys; it reads no file, so no root read row changes and the seal stands. The internal/console envelope is re-pinned in place.
+# Task 7 (the job from requested to ready and its reconciliation), rev3=PROPOSED-self-serve-moves-2: no root read, class or task is added. Nine accepted-legacy units are added: the request nonce's crypto/rand read (newRequestNonce), the fact set's data-path literal (targetDataPaths), the phase deadlines (selfServePhaseDeadline, whose matched Open is the estimate's open term) and six console SQLite units of the journal (AbortSelfServe, AdvanceSelfServeToStep, ConsumeSelfServeMaintenance, ExpireSelfServeRequest, VoidExpiredSelfServeRequest and issueSelfServeRequest). AdvanceSelfServe and IssueSelfServeRequest stay declared with no direct read (their statements moved unchanged into AdvanceSelfServeToStep and issueSelfServeRequest), so their rows are removed under a proposed H3 disposition. The internal/console envelope is re-pinned in place. The job's record reads go through observeRecord and fenceRecord, judged; its record writes are SetRecordMoveAt (the write census).
+@legacy ef59e56ac62104a8e88ee2f25c3507da162d60bcea0517512afa8a0cb30a0711 internal/console/selfserve_apply.go newRequestNonce legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads crypto/rand for one self-serve request's random nonce, the receipt the job's record write carries; randomness grants no root authority file:Read@71 bfb07e7090b5d440e80a75ce46953b498406bde7d3c193a1292c9cd0dd8af2b0
+internal/console/selfserve_apply.go newRequestNonce legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: reads crypto/rand for one self-serve request's random nonce, the receipt the job's record write carries; randomness grants no root authority file:Read@71 bfb07e7090b5d440e80a75ce46953b498406bde7d3c193a1292c9cd0dd8af2b0
+@legacy faff40689f2db1c15244128406ef4d56ca66901a66d297e1b374509fd3c72688 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 data-literal@84 f5e99416bb54a684961d961f97bd0409ea1dbe7550c1c619073c939b7b933e33
+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 data-literal@84 f5e99416bb54a684961d961f97bd0409ea1dbe7550c1c619073c939b7b933e33
+@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 283c769d76ae9ae8396c0bfbfbf9063020cdac72da0e06234d628e9cb8aaa5ba 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 file:Exec@344 b039fe9a8cc177de8d4f6acbc588911de2c9af4f5697da08274a9df690206f79
+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 file:Exec@344 b039fe9a8cc177de8d4f6acbc588911de2c9af4f5697da08274a9df690206f79
+@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
+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
+@legacy 21c5d6b0011930d8cd779e2e2af3090a140f1df6529fdaa41cd7b8b9f1ef7680 internal/console/selfserve_store.go Store.VoidExpiredSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: voids one expired, unconfirmed, unconsumed self-serve request and records the abort it obliges (abort_requested_at and its reason only when no abort was requested) in one UPDATE; no bucket or root action file:Exec@232 ababbf3459fb6fc8621a03bd1900735c638daa95ebf02d4aa2f55aefb8bf211a
+internal/console/selfserve_store.go Store.VoidExpiredSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: voids one expired, unconfirmed, unconsumed self-serve request and records the abort it obliges (abort_requested_at and its reason only when no abort was requested) in one UPDATE; no bucket or root action file:Exec@232 ababbf3459fb6fc8621a03bd1900735c638daa95ebf02d4aa2f55aefb8bf211a
+@legacy 12c3b724737ce23f27d1c7854ce33964e06d94cfdd45dcd949d2e99b80a12fc8 internal/console/selfserve_store.go Store.issueSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: IssueSelfServeRequest's UPDATE (and its variant that sets the round's step deadline in the same statement), predicated on the phase, no outcome and no unconsumed request; no bucket or root action file:Exec@1273 6cf2541380116c6da8cb9f8a310f0067a5cc4721a5e8148e04349c8462b1905e
+internal/console/selfserve_store.go Store.issueSelfServeRequest legacy accepted-legacy accepted-legacy;rev3=PROPOSED-self-serve-moves-2;basis=console.service user carlos-console, J4 root-input: IssueSelfServeRequest's UPDATE (and its variant that sets the round's step deadline in the same statement), predicated on the phase, no outcome and no unconsumed request; no bucket or root action file:Exec@1273 6cf2541380116c6da8cb9f8a310f0067a5cc4721a5e8148e04349c8462b1905e
+@removed internal/console/selfserve_store.go Store.AdvanceSelfServe 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 AdvanceSelfServeToStep, classified below, which AdvanceSelfServe calls with the phase's first substep; proposed removal only
+@removed internal/console/selfserve_store.go Store.IssueSelfServeRequest 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 issueSelfServeRequest, classified below, which IssueSelfServeRequest and IssueSelfServeRequestWithDeadline call; proposed removal only