What: the three beds that carry a checkout into a bare repository for their forge (genesis-keeps-its-bus, replay92, adoption) now share one helper, test/integration/forge.tscarry(), which sets receive.shallowUpdate=true on the bare repository before the push (and receive.autogc=false, which adoption lacked). A second branch (adoption's lab) is set with update-ref in the bare repository, because a shallow push of several refs at once has receive-pack fail every ref after the first ("remote failed to report status", git 2.56).
Why: lab run run-2026-10-14T00-09-38-410Z on shanks raised anchor and forge, then skipped: the lab module clones every repository with --depth 50, and a fresh bare repository refused the push ("shallow update not allowed").
Why this fix and not the others:
git fetch --unshallow before the push cannot work in a lab run: the lab module removes the forge credential once the run's clones are done, so a private repository (mesh-tools-go) could not be fetched again. It would also fetch over the network in every bed.
A full-history clone in the lab module would make every run of every bed pay for history no bed reads, and it needs a change in a second repository.
receive.shallowUpdate costs nothing: the bed serves the commit under test plus the 49 before it, and nothing a bed raises reads further back than the run's checkout.
Tested:
test/forge.test.ts (new): a depth-2 clone over file:// is carried into a bare repository under main and lab, and a clone from that bare repository finds the commit under test. Without the receive.shallowUpdate line it fails with the issue's text: ! [remote rejected] HEAD -> main (shallow update not allowed).
merge-check.sh: typecheck clean, 169 of 171 unit tests pass (2 skipped, as on main), replays and asks Go checks pass.
The genesis bed on shanks through lab.lab_run with this branch: see the comment below.
Only mesh-lab changes; no delivery group.
Fixes issue 689.
What: the three beds that carry a checkout into a bare repository for their forge (genesis-keeps-its-bus, replay92, adoption) now share one helper, `test/integration/forge.ts` `carry()`, which sets `receive.shallowUpdate=true` on the bare repository before the push (and `receive.autogc=false`, which adoption lacked). A second branch (adoption's `lab`) is set with `update-ref` in the bare repository, because a shallow push of several refs at once has receive-pack fail every ref after the first ("remote failed to report status", git 2.56).
Why: lab run run-2026-10-14T00-09-38-410Z on shanks raised anchor and forge, then skipped: the lab module clones every repository with `--depth 50`, and a fresh bare repository refused the push ("shallow update not allowed").
Why this fix and not the others:
- `git fetch --unshallow` before the push cannot work in a lab run: the lab module removes the forge credential once the run's clones are done, so a private repository (mesh-tools-go) could not be fetched again. It would also fetch over the network in every bed.
- A full-history clone in the lab module would make every run of every bed pay for history no bed reads, and it needs a change in a second repository.
- `receive.shallowUpdate` costs nothing: the bed serves the commit under test plus the 49 before it, and nothing a bed raises reads further back than the run's checkout.
Tested:
- `test/forge.test.ts` (new): a depth-2 clone over file:// is carried into a bare repository under main and lab, and a clone from that bare repository finds the commit under test. Without the `receive.shallowUpdate` line it fails with the issue's text: `! [remote rejected] HEAD -> main (shallow update not allowed)`.
- `merge-check.sh`: typecheck clean, 169 of 171 unit tests pass (2 skipped, as on main), replays and asks Go checks pass.
- The genesis bed on shanks through lab.lab_run with this branch: see the comment below.
Only mesh-lab changes; no delivery group.
Fixes issue 689.
mesh/repo-check head 7ed7da1398df merged into trunk 307dd23d6d2a — pass: its merge-check.sh passed, each part in its toolchain: merge-check.sh (typescript)…
The lab module clones every repository with --depth 50, and a fresh bare
repository refuses a push whose history ends in a cut, so the genesis bed
raised its anchor and forge and then skipped. The three beds that carry a
checkout into a forge now share one helper that sets receive.shallowUpdate
on the bare repository. Unshallowing instead cannot work in a lab run: the
forge credential is removed once the run's clones are done.
Deliverynovox/mesh-lab@7ed7da1398df — delivered since 2026-10-14T00:52:25Z
Delivery plan — builds nothing: the change touches no module of the mesh's graph
Transitions
2026-10-14 00:21 (new) → proposed (announced): novox/mesh-lab#103's head announced
2026-10-14 00:26 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-14 00:26 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed
2026-10-14 00:45 rejected → proposed (recheck): its repo-check failed on issue 692's fake Telegram phone, fixed by mesh-lab#104 (merged 307dd23d); judge it again against the new main
2026-10-14 00:49 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-14 00:49 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-14 00:52 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-14 00:52 published → delivered (done): nothing for a walk to move
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-lab@7ed7da1398df` — **delivered** since 2026-10-14T00:52:25Z
**Delivery plan** — builds nothing: the change touches no module of the mesh's graph
**Transitions**
- 2026-10-14 00:21 (new) → proposed (announced): novox/mesh-lab#103's head announced
- 2026-10-14 00:26 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-14 00:26 checked → rejected (refused): the gate failed or could not run, or the repository's own check failed
- 2026-10-14 00:45 rejected → proposed (recheck): its repo-check failed on issue 692's fake Telegram phone, fixed by mesh-lab#104 (merged 307dd23d); judge it again against the new main
- 2026-10-14 00:49 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-14 00:49 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-14 00:52 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-14 00:52 published → delivered (done): nothing for a walk to move
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Merge check at 7ed7da13
Judged: head 7ed7da1398df merged into trunk 1316a405a630; read beside it: mesh-catalog ebf7f3773dc7, mesh-controller ca3f43c400ba, mesh-controller-main ca3f43c400ba, mesh-host 1a2677882380, mesh-tools 954e1a53eef9
mesh/merge-gate: PASS — the change touches no module of the mesh's graph
mesh/repo-check: FAIL — merge-check.sh (typescript), replays/merge-check.sh (go) passed; its asks/merge-check.sh failed: --- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s); and TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done, TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done
Run by the build seat on novox as build-1791937309162635451 (builds --log build-1791937309162635451).
ok 151 - a detached machine cannot publish
---
duration_ms: 0.807104
type: 'test'
...
# Subtest: publishing on a segment the machine is not attached to is refused
ok 152 - publishing on a segment the machine is not attached to is refused
---
duration_ms: 0.959754
type: 'test'
...
# Subtest: two addresses of one family on one attachment is refused
ok 153 - two addresses of one family on one attachment is refused
---
duration_ms: 0.557062
type: 'test'
...
# Subtest: place naming a machine that does not exist is refused
ok 154 - place naming a machine that does not exist is refused
---
duration_ms: 0.634382
type: 'test'
...
# Subtest: every problem is reported, not just the first
ok 155 - every problem is reported, not just the first
---
duration_ms: 0.642333
type: 'test'
...
# Subtest: a detached machine is valid
ok 156 - a detached machine is valid
---
duration_ms: 1.196665
type: 'test'
...
# Subtest: a multi-homed machine is valid
ok 157 - a multi-homed machine is valid
---
duration_ms: 1.033835
type: 'test'
...
# Subtest: an isolated private segment with no gateway is valid — a site with no internet
ok 158 - an isolated private segment with no gateway is valid — a site with no internet
---
duration_ms: 0.392812
type: 'test'
...
# Subtest: two gateways sharing an address are one gateway, not two
ok 159 - two gateways sharing an address are one gateway, not two
---
duration_ms: 1.829437
type: 'test'
...
# Subtest: one box cannot behave two ways
ok 160 - one box cannot behave two ways
---
duration_ms: 0.920534
type: 'test'
...
# Subtest: a detached machine cannot declare egress
ok 161 - a detached machine cannot declare egress
---
duration_ms: 0.454892
type: 'test'
...
# Subtest: a third-party image in images: is refused, because nothing loads it
ok 162 - a third-party image in images: is refused, because nothing loads it
---
duration_ms: 2.054189
type: 'test'
...
# Subtest: one of ours in images: is accepted
ok 163 - one of ours in images: is accepted
---
duration_ms: 0.751714
type: 'test'
...
# Subtest: images: is named by tag — an image ID is not knowable until the image is built
ok 164 - images: is named by tag — an image ID is not knowable until the image is built
---
duration_ms: 0.748483
type: 'test'
...
# Subtest: a machine cannot be handed an image the scenario does not have
ok 165 - a machine cannot be handed an image the scenario does not have
---
duration_ms: 0.726893
type: 'test'
...
# Subtest: a segment may not be named 'uplink' — the lab claims that name for egress
ok 166 - a segment may not be named 'uplink' — the lab claims that name for egress
---
duration_ms: 0.657763
type: 'test'
...
# Subtest: a warm mesh built from code that has moved is refused
ok 167 - a warm mesh built from code that has moved is refused
---
duration_ms: 1.102124
type: 'test'
...
# Subtest: a warm mesh built from the same code is used
ok 168 - a warm mesh built from the same code is used
---
duration_ms: 0.145261
type: 'test'
...
# Subtest: every reason to raise instead says which reason it was
ok 169 - every reason to raise instead says which reason it was
---
duration_ms: 0.234171
type: 'test'
...
# Subtest: a repository that was not recorded when it was warmed is refused
ok 170 - a repository that was not recorded when it was warmed is refused
---
duration_ms: 0.160141
type: 'test'
...
# Subtest: a repository this run cannot locate is refused, not passed over
ok 171 - a repository this run cannot locate is refused, not passed over
---
duration_ms: 0.215061
type: 'test'
...
1..171
# tests 171
# suites 0
# pass 169
# fail 0
# cancelled 0
# skipped 2
# todo 0
# duration_ms 1172.128245
replays/ and asks/ (Go) are checked by their merge-check.sh, which the build seat runs in the Go toolchain
NOT RUN HERE: the integration suite and the replays — they need a lab and the container runtime
--- its replays/merge-check.sh (go toolchain)
ok github.com/novox/mesh-lab/replays 0.050s
NOT RUN HERE: the replays themselves — they raise containers, and this container holds no container runtime
--- its asks/merge-check.sh (go toolchain)
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL
FAIL github.com/novox/mesh-lab/asks 157.671s
FAIL
=== RUN TestTheOperatorsAnswerEndToEnd
=== RUN TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk
=== NAME TestTheOperatorsAnswerEndToEnd
faketelegram_test.go:89: phone: getUpdates from 0 hands 1 update(s)
faketelegram_test.go:113: phone: sendMessage to 42 (#2): "<b>Send the code shown on your desk</b> …" []
faketelegram_test.go:89: phone: getUpdates from 2 hands 1 update(s)
faketelegram_test.go:113: phone: sendMessage to 42 (#4): "Linked. You can answer acknowledgements now, and approve from 01:23." []
faketelegram_test.go:113: phone: sendMessage to 42 (#5): "<b>A Telegram account is now linked as you</b> …" []
=== RUN TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done
=== NAME TestTheOperatorsAnswerEndToEnd
faketelegram_test.go:113: phone: sendMessage to 42 (#6): "<b>Flip the lab's switch?</b> …" [[Approve aa259e26244244b0ad80453f1c4fe5f7] [Decline a092058ac86b2d1f5ad514bb007ebdd5]]
faketelegram_test.go:89: phone: getUpdates from 3 hands 1 update(s)
faketelegram_test.go:126: phone: answerCallbackQuery cb-7 in 42: "That answer was not taken: this message does not show what the mesh put there. Nothing was done."
proof_test.go:121: the phone never showed the refusal of an approval inside the hour (chat 42) within 1m30s; it showed:
00:23:37.931 to 42 #2 edited=false "<b>Send the code shown on your desk</b> …" []
00:23:38.034 to 42 #4 edited=false "Linked. You can answer acknowledgements now, and approve from 01:23." []
00:23:38.034 to 42 #5 edited=false "<b>A Telegram account is now linked as you</b> …" []
00:24:37.872 to 42 #6 edited=false "<b>Flip the lab's switch?</b> …" [[Approve aa259e26244244b0ad80453f1c4fe5f7] [Decline a092058ac86b2d1f5ad514bb007ebdd5]]
00:24:37.952 to 42 tap acknowledged "That answer was not taken: this message does not show what the mesh put there. Nothing was done."
=== NAME TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done
testing.go:1913: test executed panic(nil) or runtime.Goexit: subtest may have called FailNow on a parent test
=== NAME TestTheOperatorsAnswerEndToEnd
harness_test.go:311: --- what the telegram runtime said:
[mesh-tools] serving 1 tool(s) for 1 module(s): telegram.telegram_status
[mesh-tools] telegram takes its work from SEAT_CHANNEL_TELEGRAM_worker
[telegram] [telegram] taking the router's messages for this kind
[telegram] [telegram] a tap on a message not showing what this channel put there was refused
harness_test.go:311: --- what the messenger runtime said:
[mesh-tools] serving 7 tool(s) for 1 module(s): messenger.messenger_status, messenger.messenger_identities, messenger.messenger_unlink, messenger.messenger_recent, messenger.messenger_test, messenger.messenger_preview, messenger.messenger_check
[mesh-tools] serving operator-channel's open on mesh.seat.operator-channel.tool.open, admitted where messenger holds the seat
[mesh-tools] serving operator-channel's history on mesh.seat.operator-channel.tool.history, admitted where messenger holds the seat
[mesh-tools] serving operator-channel's notify on mesh.seat.operator-channel.tool.notify, admitted where messenger holds the seat
[mesh-tools] serving operator-channel's asks on mesh.seat.operator-channel.tool.asks, admitted where messenger holds the seat
[messenger] [messenger] away cannot send: no channel reaching the operator away from the machines is held: a module claims a kind of the channel bench that promises reaches-away (novox/hq ADR 0259)
[messenger] [messenger] desk cannot send: no channel at the operator's machines is held
[mesh-tools] nothing answers the caller-named mesh.seat.mesh-controller.call.conditions.anchor~messenger; asked on the subject that names no caller, where the module is told no caller (said once per subject; novox/hq issue 365)
[mesh-tools] messenger's events arrive on its consumer anchor_messenger
[mesh-tools] messenger answers the proofs on mesh.seat.intake.proof.code.*
[messenger] [messenger] listening for the controller's condition events
[messenger] [messenger] listening for what the channels say
[messenger] [messenger] answering the codes the channels are sent
[mesh-tools] messenger takes its work from SEAT_OPERATOR_CHANNEL_worker
[messenger] [messenger] taking the asks submitted to operator-channel
[messenger] [messenger] a link was asked on telegram by "Account 42" (42); its code is shown on desktop
[mesh-tools] nothing answers the caller-named mesh.seat.mesh-controller.call.root-free.anchor~messenger; asked on the subject that names no caller, where the module is told no caller (said once per subject; novox/hq issue 365)
[messenger] [messenger] lab-asker asks "Flip the lab's switch?" (a1), shown on ask.lab-asker.a1
[mesh-tools] nothing answers the caller-named mesh.seat.issue-tracker.call.tracking.anchor~messenger; asked on the subject that names no caller, where the module is told no caller (said once per subject; novox/hq issue 365)
[messenger] [messenger] could not ask which issues track the conditions: 503 no responders
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL
FAIL github.com/novox/mesh-lab/asks 157.671s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL github.com/novox/mesh-lab/asks 157.671s
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL github.com/novox/mesh-lab/asks 157.671s
**Merge check** at `7ed7da13`
Judged: head `7ed7da1398df` merged into trunk `1316a405a630`; read beside it: mesh-catalog `ebf7f3773dc7`, mesh-controller `ca3f43c400ba`, mesh-controller-main `ca3f43c400ba`, mesh-host `1a2677882380`, mesh-tools `954e1a53eef9`
- `mesh/merge-gate`: **PASS** — the change touches no module of the mesh's graph
- `mesh/repo-check`: **FAIL** — merge-check.sh (typescript), replays/merge-check.sh (go) passed; its asks/merge-check.sh failed: --- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s); and TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done, TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done
Run by the build seat on novox as `build-1791937309162635451` (`builds --log build-1791937309162635451`).
```
ok 151 - a detached machine cannot publish
---
duration_ms: 0.807104
type: 'test'
...
# Subtest: publishing on a segment the machine is not attached to is refused
ok 152 - publishing on a segment the machine is not attached to is refused
---
duration_ms: 0.959754
type: 'test'
...
# Subtest: two addresses of one family on one attachment is refused
ok 153 - two addresses of one family on one attachment is refused
---
duration_ms: 0.557062
type: 'test'
...
# Subtest: place naming a machine that does not exist is refused
ok 154 - place naming a machine that does not exist is refused
---
duration_ms: 0.634382
type: 'test'
...
# Subtest: every problem is reported, not just the first
ok 155 - every problem is reported, not just the first
---
duration_ms: 0.642333
type: 'test'
...
# Subtest: a detached machine is valid
ok 156 - a detached machine is valid
---
duration_ms: 1.196665
type: 'test'
...
# Subtest: a multi-homed machine is valid
ok 157 - a multi-homed machine is valid
---
duration_ms: 1.033835
type: 'test'
...
# Subtest: an isolated private segment with no gateway is valid — a site with no internet
ok 158 - an isolated private segment with no gateway is valid — a site with no internet
---
duration_ms: 0.392812
type: 'test'
...
# Subtest: two gateways sharing an address are one gateway, not two
ok 159 - two gateways sharing an address are one gateway, not two
---
duration_ms: 1.829437
type: 'test'
...
# Subtest: one box cannot behave two ways
ok 160 - one box cannot behave two ways
---
duration_ms: 0.920534
type: 'test'
...
# Subtest: a detached machine cannot declare egress
ok 161 - a detached machine cannot declare egress
---
duration_ms: 0.454892
type: 'test'
...
# Subtest: a third-party image in images: is refused, because nothing loads it
ok 162 - a third-party image in images: is refused, because nothing loads it
---
duration_ms: 2.054189
type: 'test'
...
# Subtest: one of ours in images: is accepted
ok 163 - one of ours in images: is accepted
---
duration_ms: 0.751714
type: 'test'
...
# Subtest: images: is named by tag — an image ID is not knowable until the image is built
ok 164 - images: is named by tag — an image ID is not knowable until the image is built
---
duration_ms: 0.748483
type: 'test'
...
# Subtest: a machine cannot be handed an image the scenario does not have
ok 165 - a machine cannot be handed an image the scenario does not have
---
duration_ms: 0.726893
type: 'test'
...
# Subtest: a segment may not be named 'uplink' — the lab claims that name for egress
ok 166 - a segment may not be named 'uplink' — the lab claims that name for egress
---
duration_ms: 0.657763
type: 'test'
...
# Subtest: a warm mesh built from code that has moved is refused
ok 167 - a warm mesh built from code that has moved is refused
---
duration_ms: 1.102124
type: 'test'
...
# Subtest: a warm mesh built from the same code is used
ok 168 - a warm mesh built from the same code is used
---
duration_ms: 0.145261
type: 'test'
...
# Subtest: every reason to raise instead says which reason it was
ok 169 - every reason to raise instead says which reason it was
---
duration_ms: 0.234171
type: 'test'
...
# Subtest: a repository that was not recorded when it was warmed is refused
ok 170 - a repository that was not recorded when it was warmed is refused
---
duration_ms: 0.160141
type: 'test'
...
# Subtest: a repository this run cannot locate is refused, not passed over
ok 171 - a repository this run cannot locate is refused, not passed over
---
duration_ms: 0.215061
type: 'test'
...
1..171
# tests 171
# suites 0
# pass 169
# fail 0
# cancelled 0
# skipped 2
# todo 0
# duration_ms 1172.128245
replays/ and asks/ (Go) are checked by their merge-check.sh, which the build seat runs in the Go toolchain
NOT RUN HERE: the integration suite and the replays — they need a lab and the container runtime
--- its replays/merge-check.sh (go toolchain)
ok github.com/novox/mesh-lab/replays 0.050s
NOT RUN HERE: the replays themselves — they raise containers, and this container holds no container runtime
--- its asks/merge-check.sh (go toolchain)
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL
FAIL github.com/novox/mesh-lab/asks 157.671s
FAIL
=== RUN TestTheOperatorsAnswerEndToEnd
=== RUN TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk
=== NAME TestTheOperatorsAnswerEndToEnd
faketelegram_test.go:89: phone: getUpdates from 0 hands 1 update(s)
faketelegram_test.go:113: phone: sendMessage to 42 (#2): "<b>Send the code shown on your desk</b> …" []
faketelegram_test.go:89: phone: getUpdates from 2 hands 1 update(s)
faketelegram_test.go:113: phone: sendMessage to 42 (#4): "Linked. You can answer acknowledgements now, and approve from 01:23." []
faketelegram_test.go:113: phone: sendMessage to 42 (#5): "<b>A Telegram account is now linked as you</b> …" []
=== RUN TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done
=== NAME TestTheOperatorsAnswerEndToEnd
faketelegram_test.go:113: phone: sendMessage to 42 (#6): "<b>Flip the lab's switch?</b> …" [[Approve aa259e26244244b0ad80453f1c4fe5f7] [Decline a092058ac86b2d1f5ad514bb007ebdd5]]
faketelegram_test.go:89: phone: getUpdates from 3 hands 1 update(s)
faketelegram_test.go:126: phone: answerCallbackQuery cb-7 in 42: "That answer was not taken: this message does not show what the mesh put there. Nothing was done."
proof_test.go:121: the phone never showed the refusal of an approval inside the hour (chat 42) within 1m30s; it showed:
00:23:37.931 to 42 #2 edited=false "<b>Send the code shown on your desk</b> …" []
00:23:38.034 to 42 #4 edited=false "Linked. You can answer acknowledgements now, and approve from 01:23." []
00:23:38.034 to 42 #5 edited=false "<b>A Telegram account is now linked as you</b> …" []
00:24:37.872 to 42 #6 edited=false "<b>Flip the lab's switch?</b> …" [[Approve aa259e26244244b0ad80453f1c4fe5f7] [Decline a092058ac86b2d1f5ad514bb007ebdd5]]
00:24:37.952 to 42 tap acknowledged "That answer was not taken: this message does not show what the mesh put there. Nothing was done."
=== NAME TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done
testing.go:1913: test executed panic(nil) or runtime.Goexit: subtest may have called FailNow on a parent test
=== NAME TestTheOperatorsAnswerEndToEnd
harness_test.go:311: --- what the telegram runtime said:
[mesh-tools] serving 1 tool(s) for 1 module(s): telegram.telegram_status
[mesh-tools] telegram takes its work from SEAT_CHANNEL_TELEGRAM_worker
[telegram] [telegram] taking the router's messages for this kind
[telegram] [telegram] a tap on a message not showing what this channel put there was refused
harness_test.go:311: --- what the messenger runtime said:
[mesh-tools] serving 7 tool(s) for 1 module(s): messenger.messenger_status, messenger.messenger_identities, messenger.messenger_unlink, messenger.messenger_recent, messenger.messenger_test, messenger.messenger_preview, messenger.messenger_check
[mesh-tools] serving operator-channel's open on mesh.seat.operator-channel.tool.open, admitted where messenger holds the seat
[mesh-tools] serving operator-channel's history on mesh.seat.operator-channel.tool.history, admitted where messenger holds the seat
[mesh-tools] serving operator-channel's notify on mesh.seat.operator-channel.tool.notify, admitted where messenger holds the seat
[mesh-tools] serving operator-channel's asks on mesh.seat.operator-channel.tool.asks, admitted where messenger holds the seat
[messenger] [messenger] away cannot send: no channel reaching the operator away from the machines is held: a module claims a kind of the channel bench that promises reaches-away (novox/hq ADR 0259)
[messenger] [messenger] desk cannot send: no channel at the operator's machines is held
[mesh-tools] nothing answers the caller-named mesh.seat.mesh-controller.call.conditions.anchor~messenger; asked on the subject that names no caller, where the module is told no caller (said once per subject; novox/hq issue 365)
[mesh-tools] messenger's events arrive on its consumer anchor_messenger
[mesh-tools] messenger answers the proofs on mesh.seat.intake.proof.code.*
[messenger] [messenger] listening for the controller's condition events
[messenger] [messenger] listening for what the channels say
[messenger] [messenger] answering the codes the channels are sent
[mesh-tools] messenger takes its work from SEAT_OPERATOR_CHANNEL_worker
[messenger] [messenger] taking the asks submitted to operator-channel
[messenger] [messenger] a link was asked on telegram by "Account 42" (42); its code is shown on desktop
[mesh-tools] nothing answers the caller-named mesh.seat.mesh-controller.call.root-free.anchor~messenger; asked on the subject that names no caller, where the module is told no caller (said once per subject; novox/hq issue 365)
[messenger] [messenger] lab-asker asks "Flip the lab's switch?" (a1), shown on ask.lab-asker.a1
[mesh-tools] nothing answers the caller-named mesh.seat.issue-tracker.call.tracking.anchor~messenger; asked on the subject that names no caller, where the module is told no caller (said once per subject; novox/hq issue 365)
[messenger] [messenger] could not ask which issues track the conditions: 503 no responders
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL
FAIL github.com/novox/mesh-lab/asks 157.671s
FAIL
--- what failed, picked from the whole of its output (the whole is in the build's log)
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL github.com/novox/mesh-lab/asks 157.671s
--- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s)
--- PASS: TestTheOperatorsAnswerEndToEnd/the_operator_links_their_account_with_the_code_shown_on_the_desk (0.20s)
--- FAIL: TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done (149.87s)
FAIL github.com/novox/mesh-lab/asks 157.671s
```
Lab run run-2026-10-14T00-21-44-014Z on shanks (refs: mesh-lab = this branch at 7ed7da1; everything else main; test/integration/genesis-keeps-its-bus.test.ts).
The forge now rises: the anchor reached git://192.0.2.30/, the installer was placed, and genesis built from the forge through steps 1 to 15 (builder, packages with gitea raised, sdk published from git://192.0.2.30/mesh-sdk.git). On main the same bed stopped before the installer ran, at the push into the forge (run-2026-10-14T00-09-38-410Z, "shallow update not allowed").
It then stopped at step 16 of 24 (base), a separate fault: building git://192.0.2.30/mesh-tools-go.git, docker push 127.0.0.1:5000/mesh-tools-go/build failed with "You're trying to push a manifest list/index which references multiple platform specific manifests, but not all of them are available locally" (NotFound: content digest sha256:e2de9651...). That is in the build agent's image push, not in the forge.
Lab run run-2026-10-14T00-21-44-014Z on shanks (refs: mesh-lab = this branch at 7ed7da1; everything else main; test/integration/genesis-keeps-its-bus.test.ts).
The forge now rises: the anchor reached git://192.0.2.30/, the installer was placed, and genesis built from the forge through steps 1 to 15 (builder, packages with gitea raised, sdk published from git://192.0.2.30/mesh-sdk.git). On main the same bed stopped before the installer ran, at the push into the forge (run-2026-10-14T00-09-38-410Z, "shallow update not allowed").
It then stopped at step 16 of 24 (base), a separate fault: building git://192.0.2.30/mesh-tools-go.git, `docker push 127.0.0.1:5000/mesh-tools-go/build` failed with "You're trying to push a manifest list/index which references multiple platform specific manifests, but not all of them are available locally" (NotFound: content digest sha256:e2de9651...). That is in the build agent's image push, not in the forge.
mesh/delivery: failure — "rejected: waits for a new head, or a recheck"
The red repo-check is not this change. The report shows the channel refusing the first tap with "this message does not show what the mesh put there" while the fake phone held the raw <b>...</b> text: that is issue 692, fixed by #104. This PR touches no file under asks/. After #104 merges, ask mesh-delivery.recheck for #103 and merge only on the new verdict.
What I checked:
carry(): init --bare, receive.autogc=false, receive.shallowUpdate=true, a single-ref push of HEAD, then update-ref for further branches to the same commit. Equivalent to the old two-ref push for adoption (main and lab both at HEAD), and the old autogc=false of genesis-keeps-its-bus and replay92 is kept (and now also applies to adoption). The returned head is the checkout's HEAD, as before.
The beds still prove what they claim: the bare repository now carries the checkout's shallow file inside the tar, so the forge serves exactly the commit under test plus the history the run's checkout holds. With a full checkout (by hand) nothing changes. If anything a bed raises ever reads history beyond the cut, it fails loudly in the bed; it cannot pass falsely. replay92's let head: string is definitely assigned before the return (tsc clean).
Locally (niced): npm ci, typecheck clean, unit suite 169 of 171 pass (2 skipped, as on main), test/forge.test.ts passes. Mutation: with receive.shallowUpdate set to false the new test fails with "! [remote rejected] HEAD -> main (shallow update not allowed)", so the test holds the fix.
The lab run on shanks in the PR comment (run-2026-10-14T00-21-44-014Z) shows the genesis bed past the forge to step 16 of 24, where it stops on an unrelated docker push of a multi-platform manifest.
Non-blocking notes:
Only genesis-keeps-its-bus was run in a lab; replay92 and adoption (the update-ref path for lab) are covered by the unit test, not by a bed run. Their forge code is the same helper, so I do not ask for it before merge.
The step 16 docker push failure stops the genesis bed before it proves anything about its bus; it deserves its own issue if it has none.
Verdict: APPROVE at 7ed7da13 — correct; mergeable only after #104 merges and a recheck turns mesh/repo-check green.
Independent review (spawned by the main session on g14; not the author).
Checks at this head:
- mesh/merge-gate: success — "PASS — the change touches no module of the mesh's graph" (build-1791937309162635451, novox)
- mesh/repo-check: failure — "FAIL — merge-check.sh (typescript), replays/merge-check.sh (go) passed; its asks/merge-check.sh failed: --- FAIL: TestTheOperatorsAnswerEndToEnd ... an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done"
- mesh/delivery: failure — "rejected: waits for a new head, or a recheck"
The red repo-check is not this change. The report shows the channel refusing the first tap with "this message does not show what the mesh put there" while the fake phone held the raw `<b>...</b>` text: that is issue 692, fixed by #104. This PR touches no file under asks/. After #104 merges, ask mesh-delivery.recheck for #103 and merge only on the new verdict.
What I checked:
1. carry(): init --bare, receive.autogc=false, receive.shallowUpdate=true, a single-ref push of HEAD, then update-ref for further branches to the same commit. Equivalent to the old two-ref push for adoption (main and lab both at HEAD), and the old autogc=false of genesis-keeps-its-bus and replay92 is kept (and now also applies to adoption). The returned head is the checkout's HEAD, as before.
2. The beds still prove what they claim: the bare repository now carries the checkout's `shallow` file inside the tar, so the forge serves exactly the commit under test plus the history the run's checkout holds. With a full checkout (by hand) nothing changes. If anything a bed raises ever reads history beyond the cut, it fails loudly in the bed; it cannot pass falsely. replay92's `let head: string` is definitely assigned before the return (tsc clean).
3. Locally (niced): npm ci, typecheck clean, unit suite 169 of 171 pass (2 skipped, as on main), test/forge.test.ts passes. Mutation: with receive.shallowUpdate set to false the new test fails with "! [remote rejected] HEAD -> main (shallow update not allowed)", so the test holds the fix.
4. The lab run on shanks in the PR comment (run-2026-10-14T00-21-44-014Z) shows the genesis bed past the forge to step 16 of 24, where it stops on an unrelated docker push of a multi-platform manifest.
Non-blocking notes:
- Only genesis-keeps-its-bus was run in a lab; replay92 and adoption (the update-ref path for `lab`) are covered by the unit test, not by a bed run. Their forge code is the same helper, so I do not ask for it before merge.
- The step 16 docker push failure stops the genesis bed before it proves anything about its bus; it deserves its own issue if it has none.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What: the three beds that carry a checkout into a bare repository for their forge (genesis-keeps-its-bus, replay92, adoption) now share one helper,
test/integration/forge.tscarry(), which setsreceive.shallowUpdate=trueon the bare repository before the push (andreceive.autogc=false, which adoption lacked). A second branch (adoption'slab) is set withupdate-refin the bare repository, because a shallow push of several refs at once has receive-pack fail every ref after the first ("remote failed to report status", git 2.56).Why: lab run run-2026-10-14T00-09-38-410Z on shanks raised anchor and forge, then skipped: the lab module clones every repository with
--depth 50, and a fresh bare repository refused the push ("shallow update not allowed").Why this fix and not the others:
git fetch --unshallowbefore the push cannot work in a lab run: the lab module removes the forge credential once the run's clones are done, so a private repository (mesh-tools-go) could not be fetched again. It would also fetch over the network in every bed.receive.shallowUpdatecosts nothing: the bed serves the commit under test plus the 49 before it, and nothing a bed raises reads further back than the run's checkout.Tested:
test/forge.test.ts(new): a depth-2 clone over file:// is carried into a bare repository under main and lab, and a clone from that bare repository finds the commit under test. Without thereceive.shallowUpdateline it fails with the issue's text:! [remote rejected] HEAD -> main (shallow update not allowed).merge-check.sh: typecheck clean, 169 of 171 unit tests pass (2 skipped, as on main), replays and asks Go checks pass.Only mesh-lab changes; no delivery group.
Fixes issue 689.
Delivery
novox/mesh-lab@7ed7da1398df— delivered since 2026-10-14T00:52:25ZDelivery plan — builds nothing: the change touches no module of the mesh's graph
Transitions
307dd23d); judge it again against the new mainThe commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.Merge check at
7ed7da13Judged: head
7ed7da1398dfmerged into trunk1316a405a630; read beside it: mesh-catalogebf7f3773dc7, mesh-controllerca3f43c400ba, mesh-controller-mainca3f43c400ba, mesh-host1a2677882380, mesh-tools954e1a53eef9mesh/merge-gate: PASS — the change touches no module of the mesh's graphmesh/repo-check: FAIL — merge-check.sh (typescript), replays/merge-check.sh (go) passed; its asks/merge-check.sh failed: --- FAIL: TestTheOperatorsAnswerEndToEnd (157.67s); and TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_done, TestTheOperatorsAnswerEndToEnd/an_approval_in_the_hour_after_linking_is_refused_and_nothing_is_doneRun by the build seat on novox as
build-1791937309162635451(builds --log build-1791937309162635451).Lab run run-2026-10-14T00-21-44-014Z on shanks (refs: mesh-lab = this branch at 7ed7da1; everything else main; test/integration/genesis-keeps-its-bus.test.ts).
The forge now rises: the anchor reached git://192.0.2.30/, the installer was placed, and genesis built from the forge through steps 1 to 15 (builder, packages with gitea raised, sdk published from git://192.0.2.30/mesh-sdk.git). On main the same bed stopped before the installer ran, at the push into the forge (run-2026-10-14T00-09-38-410Z, "shallow update not allowed").
It then stopped at step 16 of 24 (base), a separate fault: building git://192.0.2.30/mesh-tools-go.git,
docker push 127.0.0.1:5000/mesh-tools-go/buildfailed with "You're trying to push a manifest list/index which references multiple platform specific manifests, but not all of them are available locally" (NotFound: content digest sha256:e2de9651...). That is in the build agent's image push, not in the forge.Verdict: APPROVE at
7ed7da13— correct; mergeable only after #104 merges and a recheck turns mesh/repo-check green.Independent review (spawned by the main session on g14; not the author).
Checks at this head:
The red repo-check is not this change. The report shows the channel refusing the first tap with "this message does not show what the mesh put there" while the fake phone held the raw
<b>...</b>text: that is issue 692, fixed by #104. This PR touches no file under asks/. After #104 merges, ask mesh-delivery.recheck for #103 and merge only on the new verdict.What I checked:
shallowfile inside the tar, so the forge serves exactly the commit under test plus the history the run's checkout holds. With a full checkout (by hand) nothing changes. If anything a bed raises ever reads history beyond the cut, it fails loudly in the bed; it cannot pass falsely. replay92'slet head: stringis definitely assigned before the return (tsc clean).Non-blocking notes:
lab) are covered by the unit test, not by a bed run. Their forge code is the same helper, so I do not ask for it before merge.