8000 T58 — Stop min inventing box names and carry the held-name refusal to the user by minimal-foundry[bot] · Pull Request #2766 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

T58 — Stop min inventing box names and carry the held-name refusal to the user - #2766

Merged
mitodrummer merged 20 commits into
mainfrom
agent/2762-stop-min-inventing-box-names-and-carry-the-held
Oct 31, 2026
Merged

mitodrummer merged 20 commits into
mainfrom
agent/2762-stop-min-inventing-box-names-and-carry-the-held

Conversation

@minimal-foundry
@minimal-foundry minimal-foundry Bot commented Oct 30, 2026 •
Copy link
Copy Markdown
Contributor

T58 — Stop min inventing box names and carry the held-name refusal to the user

slice: S3
kind: task
covers: BOX-163
size: M
est: 300 code, 200 tests
executor: agent
difficulty: known ground
model: strongest
diagnostics: min's create log names the requested name or "fresh instance"; the refusal names the holder
observability: create span carries name source (entry, --name, fresh) and the holder on refusal
layers:
- client:
- crates/minimal-client/src/box_name.rs: no invented name
- crates/minimal-client/src/box_registration.rs: register without a minted name
- crates/minimal/src/cmd/boxes/create.rs: name only for --name; fresh-instance field; exit 2 naming the holder
- crates/minimal/src/task.rs: task runs take the fresh-instance path
- crates/minimal/src/dash/rpc.rs: dashboard create sends no minted name
- crates/minimal/src/tests.rs: pins on minted names
test: cargo nextest run -p minimal-client no_invented_directory_hex_name
test: cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder
- wire:
- crates/minimald-rpc/src/lib.rs: fresh-instance field; refusal carries the holder
- crates/minimald/src/rpc.rs: holder refusal passes through; fresh-instance maps to create_fresh_box_with_spec
test: cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name
test: cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix
produces: none
consumes: none
proof: min creates a box named from its entry with no invented name; a second run of a held name gets -; a create under a running box's name exits 2 naming the holder.
depends on:
- blocked by #2400
- blocked by #2758

Proof

min session activate with no --name sends no name, and the daemon names the box from its entry (default for a session). No

- name is minted anywhere in min, min dash or min task run. When a running box holds the entry's name, min sends the create again as a fresh instance and the box is named -. Every min task run is a fresh instance, -. A create under a --name that a running box holds ends min with exit 2 and prints: Cannot create a session named <name>: the running session <holder> () holds that name. Rename that session with min session rename <id> <new-name>, or choose another name.

Notes from the agent: Files touched outside the layers, and why: (1) crates/minimal/src/main.rs: failure_exit_code maps minimald_rpc::HeldNameRefusal to exit 2. Without it min cannot exit 2, because the exit codes are decided only there. (2) crates/minimal/src/cmd/mod.rs: it re-exported autogen_session_name, random_hex4, sanitize_name_component, should_retry_autogen and AUTOGEN_NAME_RETRIES. Those are removed, so the re-export lines go. (3) crates/minimal/src/cmd/boxes/vm_host.rs: its test autogen_registration_reminted_on_a_held_name called the removed register_box_reminting_autogen. It is now registration_under_a_held_name_is_refused. (4) crates/minimald-rpc/src/tests.rs: two CreateSessionRequest struct literals need the new fresh_instance field to compile.

Design: the holder rides in the reply's error text. Errorable has only a string error, and a typed error variant would change every CreateSession call site in the workspace. minimald_rpc::HeldNameRefusal spells the text (Display) and parses it back (from_error), so one definition owns both. The new minimald tests live in an inline mod create_naming_tests in rpc.rs, not in rpc/tests.rs, to stay inside the layers. After a create, min reads the name the daemon gave the box with GetSessionRecord, for the start lines, the name hold and the cleanup. CreateSessionResponse has no name…[truncated]

Tests

line exit tail
cargo nextest run -p minimal-client no_invented_directory_hex_name 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-24ad... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-acc2... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-1c86... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/workbench/crates/client-config) Compiling stdlib v0
cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-c0f4... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify

min task run agent-verify exited 100 under rustc 1.99.0, which the repository does not pin (1.99.1 in rust-toolchain.toml); the PR is not a draft on that alone — CI, which honours the pin, is the gate.

t_span_id": "9fcfb3224f262c0d",
                "span_id": "0d1caf63210de196",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetDenyAllOptOut",
                "parent_span_id": "9fcfb3224f262c0d",
                "span_id": "ee5277a551139221",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetPaths",
                "parent_span_id": "9fcfb3224f262c0d",
                "span_id": "854bfbc02cf14d41",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "GetRecord",
                "parent_span_id": "9fcfb3224f262c0d",
                "queued_behind": "0",
                "span_id": "dd171525c085c217",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "DeleteSession",
                "parent_span_id": "9fcfb3224f262c0d",
                "queued_behind": "0",
                "span_id": "f213906543daca58",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "Destroy",
                "parent_span_id": "f213906543daca58",
                "span_id": "a984577d37022cb5",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
    ]
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   5.019s] ( 906/2261) minimal-client box_registration::tests::resume_timeout_goes_on_and_an_absent_host_fails_closed
        PASS [   6.066s] ( 907/2261) minimal-client box_registration::tests::a_silent_daemon_does_not_hold_the_exit_past_the_deadline
        PASS [   4.499s] ( 908/2261) minimal-client tty_relay::tests::resume_after_drop_prints_line_and_nudges_winsize
────────────
     Summary [  41.823s] 908/2261 tests run: 907 passed, 1 failed, 24 skipped
        FAIL [   3.297s] ( 905/2261) minimal::otel_cli exec_run_attach_and_task_run_share_the_commands_trace
warning: 1353/2261 tests were not run due to test failure (run with --no-fail-fast to run all tests, or run with --max-fail)
error: test run failed

Out of scope

These files are outside the task's layers:, so this PR is a draft:

  • crates/minimal/src/cmd/boxes/vm_host.rs
  • crates/minimal/src/cmd/mod.rs
  • crates/minimal/src/main.rs
  • crates/minimald-rpc/src/tests.rs

Closes #2762


Undrafted by the maintainer: the edits outside the layers are accepted. They are crates/minimal/src/cmd/boxes/vm_host.rs, crates/minimal/src/cmd/mod.rs, crates/minimal/src/main.rs, crates/minimald-rpc/src/tests.rs, crates/minimald/src/rpc/tests.rs, scripts/session-e2e.sh (the daemon's <entry>-<n> names) and crates/minimald/src/box_manager.rs (an entry cleaned into a valid name).

Round 4 adds crates/boxes/src/lib.rs (the shared entry_box_name, accepted) and crates/minimald/src/box_manager/tests.rs (the test the maintainer asked for, for the accepted box_manager.rs change).

CreateSession gains fresh_instance. The daemon then names the box
<name>-<n> through create_fresh_box_with_spec. A create under a name a
running box holds is refused with a reply that names the holder, which
a client reads back with HeldNameRefusal::from_error (BOX-163).
min no longer mints <dir>-<hex> names. A create carries a name only
for --name, and the daemon names the box from its entry. A held entry
name makes the create a fresh instance, <name>-<n>. Task runs are
always fresh instances. A --name that a running box holds ends min with
exit 2, naming the holder (BOX-163).

The VM host row is registered under the name the daemon will give the
box, and a held row name is no longer re-minted. cmd/mod.rs loses the
minting re-exports, main.rs maps the refusal to exit 2, and the
vm_host test that pinned the re-mint now pins the refusal.
@coderabbitai
coderabbitai Bot commented Oct 30, 2026 •
Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 3cd8fb55-f4fc-468e-9853-97333d28cf6f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

@mitodrummer
Copy link
Copy Markdown
Member

/revise The maintainer accepts these files outside the layers: the four already edited (crates/minimal/src/cmd/boxes/vm_host.rs, crates/minimal/src/cmd/mod.rs, crates/minimal/src/main.rs, crates/minimald-rpc/src/tests.rs), plus crates/minimald/src/rpc/tests.rs, scripts/session-e2e.sh and crates/minimald/src/box_manager.rs. Touch nothing outside those and the layers.

  1. CI tests fails minimald rpc::tests::create_session_errors_if_name_not_unique (crates/minimald/src/rpc/tests.rs): it pins the old fixed text "A session with that name already exists". Update it to assert the new held-name refusal (the holder's name and id, the rename hint), not the exact full sentence.

  2. CI native-daemon-e2e fails in scripts/session-e2e.sh (~lines 6097-6125): it greps for the old minted task-e2e-echo-<hex> names. A task run is now a fresh instance named <entry>-<n>. Update all three checks to the new names: the two "ephemeral session still listed" checks (after min task run e2e-echo and after the failing e2e-fail run) must match e2e-echo-<n> / e2e-fail-<n> (as written they would now pass vacuously), and the --keep check must find the kept e2e-echo-<n> box (grep -o 'e2e-echo-[0-9]\+') and use it as before. Update the comment that says task-<task>-<hex>. Grep the script for any other task-<name>- or -[0-9a-f]\{4\} pattern on minted names and update it the same way.

  3. Regression: task runs now send no name, so the daemon names the box from the task's entry. The client used to pass the task name through sanitize_name_component; nothing does now, and an entry like build_all or ci.lint is not a valid box name (validate_session_name wants a DNS label), so min task run build_all would fail to create. In crates/minimald/src/box_manager.rs, map an entry-derived name onto a valid label in creation_name() / fresh_instance_name() (same rules as the client's old sanitize_name_component: lowercase, _ and . to -, trim to fit the label limit leaving room for -<n>). Leave a [box] name or --name the user wrote unchanged, so an invalid one is still refused. Add a test: a task entry build_all gets the box name build-all-1.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

That /revise is held, not dropped. A coder is already running on #2762. Your note is kept and goes into the next round here, which starts when that coder finishes.

Nothing to type again: the command gets a rocket when its round starts, or a refusal that names the reason. No round was counted for it yet.

Task runs no longer mint task-<task>-<hex>. The daemon names a task
box from its entry with the smallest unused suffix.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 1 of 10 on a failed check suite, pushed as 9ac04872d4d6.

line exit tail
cargo nextest run -p minimal-client no_invented_directory_hex_name 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-f65c... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-1c72... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-4d33... Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/workbench/crates/client-config) Compiling stdlib v0
cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-e310... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify min task run agent-verify exited 100 under rustc 1.99.0, which the repository does not pin (1.99.1 in rust-toolchain.toml); the PR is not a draft on that alone — CI, which honours the pin, is the gate.

t_span_id": "92bc3f242060e395",
                "span_id": "42d6c1f90f47fbdd",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetDenyAllOptOut",
                "parent_span_id": "92bc3f242060e395",
                "span_id": "56db9eb3188b8c2a",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetPaths",
                "parent_span_id": "92bc3f242060e395",
                "span_id": "361460bb17e0d17b",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "GetRecord",
                "parent_span_id": "92bc3f242060e395",
                "queued_behind": "0",
                "span_id": "b8bfeb3736303389",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "DeleteSession",
                "parent_span_id": "92bc3f242060e395",
                "queued_behind": "0",
                "span_id": "73edb4f023f2b656",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "Destroy",
                "parent_span_id": "73edb4f023f2b656",
                "span_id": "5fafd05a2d6949be",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
    ]
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   5.009s] ( 906/2261) minimal-client box_registration::tests::resume_timeout_goes_on_and_an_absent_host_fails_closed
        PASS [   4.316s] ( 907/2261) minimal-client tty_relay::tests::resume_after_drop_prints_line_and_nudges_winsize
        PASS [   6.154s] ( 908/2261) minimal-client box_registration::tests::a_silent_daemon_does_not_hold_the_exit_past_the_deadline
────────────
     Summary [  37.572s] 908/2261 tests run: 907 passed, 1 failed, 24 skipped
        FAIL [   3.278s] ( 905/2261) minimal::otel_cli exec_run_attach_and_task_run_share_the_commands_trace
warning: 1353/2261 tests were not run due to test failure (run with --no-fail-fast to run all tests, or run with --max-fail)
error: test run failed

Outside the task's layers::

  • crates/minimal/src/cmd/boxes/vm_host.rs
  • crates/minimal/src/cmd/mod.rs
  • crates/minimal/src/main.rs
  • crates/minimald-rpc/src/tests.rs
  • crates/minimald/src/rpc/tests.rs
  • scripts/session-e2e.sh

Converted to a draft: something above needs a person before review.

min creates a box named from its entry and invents no name. A second task run of a held name gets -, as e2e-echo-1 in the e2e index shows. A create under a running box's name exits 2, and the refusal names the holder by name and id.

Notes from the agent: Revise round 1 addressed two failed checks. (1) tests: minimald rpc::tests::create_session_errors_if_name_not_unique still pinned the old text "A session with that name already exists". It now pins the new refusal that names the holder. The file crates/minimald/src/rpc/tests.rs is the test module of the crates/minimald/src/rpc.rs layer. (2) native-daemon-e2e: scripts/session-e2e.sh matched task boxes by the old minted name task--. This task changes that name to -, so the script now matches e2e-echo-, e2e-fail- and e2e-port-run-. scripts/session-e2e.sh is outside the task's layers. I touched it because the task's intended behaviour change broke its name pins, and no other fix keeps the e2e lane green. ci-linux-native-success is the aggregator and fails because of the two jobs above. Before the fix, a full run of -p minimal -p minimal-client -p minimald-rpc -p minimald gave 2260 passed and 1 failed. I did not run the e2e script on this box, so the native-daemon-e2e lane still owes that evidence.

An entry such as build_all or ci.lint is not a DNS label. The daemon
now maps an entry-derived name onto one, so min task run build_all
creates build-all-1. A [box] name or --name stays unchanged.

The held-name test checks the holder and the rename hint, not the
whole sentence.
@mitodrummer
Copy link
Copy Markdown
Member

/revise Within the files already accepted. creation_name() in crates/minimald/src/box_manager.rs passes spec.box_name() through entry_box_name, but BoxSpec::box_name() (crates/mfile/src/spec.rs:175) returns the user's [box] name when one is set, else the entry. So a user-written [box] name = "My_Box" is silently rewritten to my-box instead of refused, which contradicts the new doc comment ("a [box] name or a --name never passes through here"). Clean only the entry: when the spec sets [box] name, use it unchanged (so validate_session_name still refuses an invalid one); when it does not, use entry_box_name(entry). Read the spec's name and entry fields directly rather than box_name(); spec.rs is outside the layers, so do not change it. Add a test: a spec with [box] name = "My_Box" is refused as an invalid name, and one with no [box] name and entry build_all is named build-all.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

That /revise is held, not dropped. A coder is already running on #2762. Your note is kept and goes into the next round here, which starts when that coder finishes.

Nothing to type again: the command gets a rocket when its round starts, or a refusal that names the reason. No round was counted for it yet.

@mitodrummer
Copy link
Copy Markdown
Member

/revise Also merge origin/main first: #2723 (node-plane baseline set) and #2767 (bep re-certify) landed after this branch and conflict with it in create.rs, vm_host.rs, dash/rpc.rs, task.rs, box_registration.rs, minimald-rpc lib.rs, minimald rpc.rs, minimal tests.rs and scripts/session-e2e.sh. Resolve by keeping both sides: main's additions stay, and this branch's BOX-163 changes (no invented names, the fresh-instance field, the holder refusal and exit 2) apply on top. Then do the [box] name note above.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

That /revise is held, not dropped. A coder is already running on #2762. Your note is kept and goes into the next round here, which starts when that coder finishes.

Nothing to type again: the command gets a rocket when its round starts, or a refusal that names the reason. No round was counted for it yet.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 2 of 10 on a /revise note, pushed as 1be73506ef28.

line exit tail
cargo nextest run -p minimal-client no_invented_directory_hex_name 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-1a66... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-84e0... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-5e88... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/workbench/crates/client-config) Compiling stdlib v0
cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-aa64... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify min task run agent-verify timed out after 1800s.

es)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking ratatui-widgets v0.3.2
    Checking ratatui-crossterm v0.1.2
    Checking inquire v0.9.4
    Checking insta v1.49.0
    Checking ratatui-macros v0.7.2
    Checking ratatui v0.30.2
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking rusty-fork v0.3.1
   Compiling serial_test_derive v4.0.1
    Checking proptest v1.12.0
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking minimal-client v0.8.0 (/workbench/crates/minimal-client)
    Checking serial_test v4.0.1
    Checking graph v0.0.1 (/workbench/crates/graph)
    Checking lcache v0.0.1 (/workbench/crates/lcache)
    Checking rcache v0.0.1 (/workbench/crates/rcache)
    Checking op v0.0.1 (/workbench/crates/op)
    Checking check v0.0.1 (/workbench/crates/check)
    Checking orchestrator v0.0.1 (/workbench/crates/orchestrator)
    Checking mctx v0.0.1 (/workbench/crates/mctx)
    Checking minimald v0.8.0 (/workbench/crates/minimald)
    Checking minimal v0.8.0 (/workbench/crates/minimal)
    Finished `dev` profile [unoptimized] target(s) in 1m 38s
   Compiling opentelemetry v0.33.1
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
   Compiling rusty-fork v0.3.1
   Compiling serial_test v4.0.1
   Compiling proptest v1.12.0
   Compiling opentelemetry_sdk v0.33.1
   Compiling tracing-opentelemetry v0.34.0
   Compiling opentelemetry-http v0.33.1
   Compiling opentelemetry-appender-tracing v0.33.1
   Compiling google-cloud-gax-internal v0.7.20
   Compiling opentelemetry-proto v0.33.0
   Compiling google-cloud-longrunning v1.14.0
   Compiling google-cloud-iam-v1 v1.13.0
   Compiling opentelemetry-otlp v0.33.0
   Compiling google-cloud-lro v1.11.0
   Compiling mlog v0.0.1 (/workbench/crates/mlog)
   Compiling google-cloud-storage v1.20.0
   Compiling common v0.0.1 (/workbench/crates/common)
   Compiling boxes v0.0.1 (/workbench/crates/boxes)
   Compiling sandbox v0.0.1 (/workbench/crates/sandbox)
   Compiling mfile v0.0.1 (/workbench/crates/mfile)
   Compiling minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
   Compiling decode v0.0.1 (/workbench/crates/decode)
   Compiling checkouts v0.0.1 (/workbench/crates/checkouts)
   Compiling minimal-client v0.8.0 (/workbench/crates/minimal-client)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
   Compiling graph v0.0.1 (/workbench/crates/graph)
   Compiling lcache v0.0.1 (/workbench/crates/lcache)
   Compiling rcache v0.0.1 (/workbench/crates/rcache)
   Compiling op v0.0.1 (/workbench/crates/op)
   Compiling check v0.0.1 (/workbench/crates/check)
   Compiling orchestrator v0
8BD0
.0.1 (/workbench/crates/orchestrator)
   Compiling mctx v0.0.1 (/workbench/crates/mctx)
   Compiling minimald v0.8.0 (/workbench/crates/minimald)
   Compiling minimal v0.8.0 (/workbench/crates/minimal)

Outside the task's layers::

  • crates/minimal/src/cmd/boxes/vm_host.rs
  • crates/minimal/src/cmd/mod.rs
  • crates/minimal/src/main.rs
  • crates/minimald-rpc/src/tests.rs
  • crates/minimald/src/box_manager.rs
  • crates/minimald/src/rpc/tests.rs
  • scripts/session-e2e.sh

Converted to a draft: something above needs a person before review.

min creates a box named from its entry and invents no name. A second run of a held name gets -. A create under a running box's name exits 2 and names the holder. A task entry such as build_all now creates the box build-all-1 and is not refused.

Notes from the agent: Revise round 2. Item 1: the commit 5b891c4 was already on the branch, but it pinned the full sentence. The test create_session_errors_if_name_not_unique now checks the holder's name, its id and the rename hint, not the exact sentence. Item 2: commit 9ac0487 already changed every minted-name check in scripts/session-e2e.sh to -, with the comment and the e2e-port-run checks too. A grep found no other task-- or hex-suffix pattern on minted names, so this round did not change the script. Item 3: box_manager.rs adds entry_box_name. It lowercases, maps -, _ and . to -, drops other characters, caps the name at 48 octets and trims - at the ends. An empty result becomes box. creation_name applies it only to an entry-derived name, so a [box] name or --name passes unchanged and an invalid one is still refused. The new test create_session_fresh_instance_maps_the_entry_onto_a_label is in rpc.rs next to the other naming tests. It checks build_all -> build-all-1 and CI.Lint -> ci-lint-1. I also corrected two stale doc comments in box_manager.rs: the interim note on creation_name, and the note that no request field asks for a fresh instance. I did not run just clippy-strict. cargo clippy -p minimald --all-targets is clean. I did not run the e2e script (native-daemon-e2e lane).

…nventing-box-names-and-carry-the-held

# Conflicts:
#	crates/minimal/src/cmd/boxes/create.rs
#	crates/minimal/src/task.rs
creation_name() cleaned spec.box_name(), which is the [box] name when set. It now reads spec.entry, so an invalid [box] name is refused, not rewritten.
@mitodrummer
mitodrummer marked this pull request as ready for review October 31, 2026 01:55
@mitodrummer
mitodrummer requested a review from a team as a code owner October 31, 2026 01:55
@minimal-foundry
minimal-foundry Bot commented Oct 31, 2026 •
Copy link
Copy Markdown
Contributor Author

Approved: no findings at 3f3c8e7fe510.

Nothing to do.

Verdict APPROVE, posted as a comment: the App cannot review its own pull request; the check and the label carry it.

Clobber: none seen. Earlier threads cover the name mismatch between the VM host row and the daemon, and the fresh-instance retry branch. The current code resolves both.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — advisory review

Verdict COMMENT — 2 findings, 2 inline.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arch-review: CONDITIONS · 1 condition · the full ruling

The change stops min from inventing box names, and the daemon names a box from its entry as BOX-163 requires. One path deviates. activate_box() sends a refused create again as a fresh instance when the person typed no --name. The Addressing section, line 389, says start refuses a held name with exit 2 and names the holder. Only run and --new create <name>-<n>. Remove that fallback as C1 describes. Then the change conforms.

Ruled at f760828 against gominimal/arch@8640f85e193d by claude-opus-5-5.

Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
Comment thread crates/minimal-client/src/box_name.rs Resolved
Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 3 of 10 on a /revise note, pushed as f760828df588.

Resolved conflicts in: crates/minimal/src/cmd/boxes/create.rs, crates/minimal/src/task.rs

line exit tail
cargo nextest run -p minimal-client no_invented_directory_hex_name 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-9bfd... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-4a8c... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-b1de... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/workbench/crates/client-config) Compiling stdlib v0
cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-ac40... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify min task run agent-verify timed out after 1800s.

g common v0.0.1 (/workbench/crates/common)
    Checking mlog v0.0.1 (/workbench/crates/
10BC8
mlog)
    Checking diagnostics v0.0.1 (/workbench/crates/diagnostics)
    Checking boxes v0.0.1 (/workbench/crates/boxes)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking async-dialog v0.0.1 (/workbench/crates/async-dialog)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking minimal-client v0.8.0 (/workbench/crates/minimal-client)
    Checking graph v0.0.1 (/workbench/crates/graph)
    Checking lcache v0.0.1 (/workbench/crates/lcache)
    Checking rcache v0.0.1 (/workbench/crates/rcache)
    Checking op v0.0.1 (/workbench/crates/op)
    Checking check v0.0.1 (/workbench/crates/check)
    Checking orchestrator v0.0.1 (/workbench/crates/orchestrator)
    Checking mctx v0.0.1 (/workbench/crates/mctx)
    Checking minimald v0.8.0 (/workbench/crates/minimald)
    Checking minimal v0.8.0 (/workbench/crates/minimal)
    Finished `dev` profile [unoptimized] target(s) in 1m 03s
   Compiling opentelemetry v0.33.1
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
   Compiling rusty-fork v0.3.1
   Compiling serial_test v4.0.1
   Compiling proptest v1.12.0
   Compiling opentelemetry_sdk v0.33.1
   Compiling tracing-opentelemetry v0.34.0
   Compiling opentelemetry-http v0.33.1
   Compiling opentelemetry-appender-tracing v0.33.1
   Compiling google-cloud-gax-internal v0.7.20
   Compiling opentelemetry-proto v0.33.0
   Compiling opentelemetry-otlp v0.33.0
   Compiling google-cloud-longrunning v1.14.0
   Compiling google-cloud-iam-v1 v1.13.0
   Compiling mlog v0.0.1 (/workbench/crates/mlog)
   Compiling google-cloud-lro v1.11.0
   Compiling google-cloud-storage v1.20.0
   Compiling common v0.0.1 (/workbench/crates/common)
   Compiling boxes v0.0.1 (/workbench/crates/boxes)
   Compiling sandbox v0.0.1 (/workbench/crates/sandbox)
   Compiling mfile v0.0.1 (/workbench/crates/mfile)
   Compiling minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
   Compiling decode v0.0.1 (/workbench/crates/decode)
   Compiling checkouts v0.0.1 (/workbench/crates/checkouts)
   Compiling minimal-client v0.8.0 (/workbench/crates/minimal-client)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
   Compiling graph v0.0.1 (/workbench/crates/graph)
   Compiling lcache v0.0.1 (/workbench/crates/lcache)
   Compiling rcache v0.0.1 (/workbench/crates/rcache)
   Compiling op v0.0.1 (/workbench/crates/op)
   Compiling check v0.0.1 (/workbench/crates/check)
   Compiling orchestrator v0.0.1 (/workbench/crates/orchestrator)
   Compiling mctx v0.0.1 (/workbench/crates/mctx)
   Compiling minimald v0.8.0 (/workbench/crates/minimald)
   Compiling minimal v0.8.0 (/workbench/crates/minimal)

Outside the task's layers::

  • crates/minimal/src/cmd/boxes/vm_host.rs
  • crates/minimal/src/cmd/mod.rs
  • crates/minimal/src/main.rs
  • crates/minimald-rpc/src/tests.rs
  • crates/minimald/src/box_manager.rs
  • crates/minimald/src/box_manager/tests.rs
  • crates/minimald/src/rpc/tests.rs
  • scripts/session-e2e.sh

Converted to a draft: something above needs a person before review.

min creates a box named from its entry with no invented name. A second run of a held name gets -. A create under a running box's name exits 2 and names the holder. A [box] name that is not a valid label, such as My_Box, is now refused and not rewritten to my-box.

Notes from the agent: Merge of origin/main: only create.rs and task.rs had conflict markers. In both files I kept main's HostIpResidency::admit and put this branch's daemon_box_name read-back after it. In task.rs, main's request.config.name.expect("the task session is always named") was dropped, because under BOX-163 the client sends no name and the daemon names the task box. The other files git listed as conflicting merged without markers. cargo clippy -p minimal -p minimald -p minimal-client -p minimald-rpc --all-targets is clean after the merge. [box] name note: creation_name() already returned a spec's [box] name unchanged before it reached entry_box_name. Only the entry branch still read spec.box_name(). That branch now reads spec.entry directly. spec.rs is unchanged. box_manager.rs and box_manager/tests.rs are outside the task's layers. An earlier round of this PR already touched them, and the held note asks for this change there. The new test is box_name_is_refused_unchanged_and_entry_is_cleaned. I did not run just ci, the whole-crate suites, or scripts/session-e2e.sh.

@minimal-foundry
minimal-foundry Bot marked this pull request as draft October 31, 2026 02:03
@mitodrummer
Copy link
Copy Markdown
Member

/revise Two fixes. The maintainer decided both and accepts one more file outside the layers: crates/boxes/src/lib.rs (its box_name module).

  1. arch C1, accepted as designed: a plain start under a held name is refused. In crates/minimal/src/cmd/boxes/create.rs activate_box(), delete the if registered.is_none() && retry_as_fresh_instance(...) { request.fresh_instance = true; continue; } branch in the ActivationStep::CreateSession loop, so every held-name refusal reaches withdraw_box_row and return Err(create_refusal(error)) (exit 2, naming the holder), with or without --name. Delete typed_name if nothing else reads it. Rewrite the comments at the typed_name binding (~line 1274) and above let created = ActivationStep::CreateSession to say a held entry name is refused. In crates/minimal-client/src/box_name.rs, delete retry_as_fresh_instance and its assertions in no_invented_directory_hex_name. Add an assertion that an untyped create under a held name does not set fresh_instance. Only min task run sets fresh_instance (a future --new is BCLI's). Fix the PR body's Proof paragraph to match.

  2. minimal-review PRRT_kwDOPdfcxM6yMdS7: created_box_name (create.rs ~1020) uses the raw entry from spec.box_name(), but the daemon names the box with entry_box_name. So for an entry like My App the VM host row is registered as My App while the box is myapp. Move entry_box_name (and ENTRY_NAME_MAX) from crates/minimald/src/box_manager.rs into crates/boxes/src/lib.rs box_name as a pub fn, and call that one function from both the daemon's creation_name() and the client's created_box_name() for the entry (never for a [box] name or --name). Keep the daemon's existing tests passing, and add a client test: entry My App registers and creates under the same cleaned name.

minimal-review PRRT_kwDOPdfcxM6yMdS8 (the VM-host path refusing where native renamed) is resolved by fix 1, because both paths now refuse. Touch nothing else.

A plain create under a name that a running box holds no longer retries as
a fresh instance. It ends with exit 2 and names the holder, with or without
--name. Only min task run asks for a fresh instance.
@mitodrummer
Copy link
Copy Markdown
Member

/revise One item only, minimal-review PRRT_kwDOPdfcxM6yTLwG: in crates/minimal/src/task.rs (~line 560), interactive_task_box_name sits between the "Run a declared task in an ephemeral session..." doc comment and pub async fn cmd_task_run, so rustdoc attaches that comment to the helper. Move the helper, with its own doc comment, above the cmd_task_run doc comment. Change nothing else.

…nventing-box-names-and-carry-the-held

# Conflicts:
#	crates/minimal/src/cmd/boxes/create.rs
interactive_task_box_name sat between the comment and the function, so rustdoc attached the comment to the helper.
@mitodrummer
Copy link
Copy Markdown
Member

/revise Also merge origin/main: the branch conflicts with main again. Resolve by keeping both sides: main's changes stay, and this branch's BOX-163 changes apply on top. Then do the doc-comment move above. Change nothing else.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

That /revise is held, not dropped. A coder is already running on #2762. Your note is kept and goes into the next round here, which starts when that coder finishes.

Nothing to type again: the command gets a rocket when its round starts, or a refusal that names the reason. No round was counted for it yet.

@mitodrummer
mitodrummer marked this pull request as ready for review October 31, 2026 18:55
@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arch-review: PASS · the full ruling

The new commits do not change the ruling. The merge of main has one resolved conflict in activate_box. That resolution keeps the name that the daemon gave the box, and it keeps the T110 at_own_address argument. The other commit only moves a doc comment in task.rs. BOX-163 conforms to Addressing line 389, as it did on 47dbf1b2.

Ruled at 3f582ac against gominimal/arch@8640f85e193d by claude-opus-5-5.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — advisory review

Verdict COMMENT — 1 finding, 1 inline.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

Comment thread crates/minimal/src/cmd/boxes/create.rs Resolved
@mitodrummer
Copy link
Copy Markdown
Member

/revise One item, minimal-review PRRT_kwDOPdfcxM6yTu83: in crates/minimal/src/cmd/boxes/create.rs mint_into_request (~line 1006), the failure arm withdraws the VM host row with request.config.name.as_deref(). For an activation without --name that is now None, so withdraw_box_row returns at once and the row stays published. Pass the name the row was registered under (the same box_name the other withdrawals use) into mint_into_request and withdraw with it. Add a test: an unnamed own-address activation whose grant mint fails withdraws its row. Change nothing else.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

That /revise is held, not dropped. A coder is already running on #2762. Your note is kept and goes into the next round here, which starts when that coder finishes.

Nothing to type again: the command gets a rocket when its round starts, or a refusal that names the reason. No round was counted for it yet.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 1 of 10 on a /revise note, pushed as 3f582acdfb05.

Resolved conflicts in: crates/minimal/src/cmd/boxes/create.rs

line exit tail
cargo nextest run -p minimal-client no_invented_directory_hex_name 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-6bb3... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-4545... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-d928... Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/workbench/crates/client-config) Compiling stdlib v0
cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-e19a... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify min task run agent-verify timed out after 1800s.

 Checking rusty-fork v0.3.1
    Checking rand_xorshift v0.5.0
    Checking core_detect v1.0.0
    Checking unarray v0.1.4
   Compiling serial_test_derive v4.0.1
    Checking proptest v1.12.0
    Checking serial_test v4.0.1
    Checking common v0.0.1 (/workbench/crates/common)
    Checking boxes v0.0.1 (/workbench/crates/boxes)
    Checking sandbox v0.0.1 (/workbench/crates/sandbox)
    Checking mfile v0.0.1 (/workbench/crates/mfile)
    Checking minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
    Checking decode v0.0.1 (/workbench/crates/decode)
    Checking checkouts v0.0.1 (/workbench/crates/checkouts)
    Checking graph v0.0.1 (/workbench/crates/graph)
    Checking minimal-client v0.8.0 (/workbench/crates/minimal-client)
    Checking lcache v0.0.1 (/workbench/crates/lcache)
    Checking rcache v0.0.1 (/workbench/crates/rcache)
    Checking op v0.0.1 (/workbench/crates/op)
    Checking check v0.0.1 (/workbench/crates/check)
    Checking orchestrator v0.0.1 (/workbench/crates/orchestrator)
    Checking mctx v0.0.1 (/workbench/crates/mctx)
    Checking minimald v0.8.0 (/workbench/crates/minimald)
    Checking minimal v0.8.0 (/workbench/crates/minimal)
    Finished `dev` profile [unoptimized] target(s) in 1m 08s
   Compiling opentelemetry v0.33.1
   Compiling stdlib v0.0.22 (/workbench/crates/stdlib)
   Compiling version v0.8.0 (/workbench/crates/version)
   Compiling rusty-fork v0.3.1
   Compiling serial_test v4.0.1
   Compiling proptest v1.12.0
   Compiling opentelemetry_sdk v0.33.1
   Compiling tracing-opentelemetry v0.34.0
   Compiling opentelemetry-http v0.33.1
   Compiling opentelemetry-appender-tracing v0.33.1
   Compiling google-cloud-gax-internal v0.7.20
   Compiling opentelemetry-proto v0.33.0
   Compiling opentelemetry-otlp v0.33.0
   Compiling google-cloud-longrunning v1.14.0
   Compiling google-cloud-iam-v1 v1.13.0
   Compiling mlog v0.0.1 (/workbench/crates/mlog)
   Compiling google-cloud-lro v1.11.0
   Compiling google-cloud-storage v1.20.0
   Compiling common v0.0.1 (/workbench/crates/common)
   Compiling boxes v0.0.1 (/workbench/crates/boxes)
   Compiling sandbox v0.0.1 (/workbench/crates/sandbox)
   Compiling mfile v0.0.1 (/workbench/crates/mfile)
   Compiling minimald-rpc v0.0.1 (/workbench/crates/minimald-rpc)
   Compiling decode v0.0.1 (/workbench/crates/decode)
   Compiling checkouts v0.0.1 (/workbench/crates/checkouts)
   Compiling minimal-client v0.8.0 (/workbench/crates/minimal-client)
   Compiling minvmd v0.8.0 (/workbench/crates/minvmd)
   Compiling graph v0.0.1 (/workbench/crates/graph)
   Compiling lcache v0.0.1 (/workbench/crates/lcache)
   Compiling rcache v0.0.1 (/workbench/crates/rcache)
   Compiling op v0.0.1 (/workbench/crates/op)
   Compiling check v0.0.1 (/workbench/crates/check)
   Compiling orchestrator v0.0.1 (/workbench/crates/orchestrator)
   Compiling mctx v0.0.1 (/workbench/crates/mctx)
   Compiling minimald v0.8.0 (/workbench/crates/minimald)
   Compiling minimal v0.8.0 (/workbench/crates/minimal)

Outside the task's layers::

  • crates/boxes/src/lib.rs
  • crates/minimal/src/cmd/boxes/vm_host.rs
  • crates/minimal/src/cmd/mod.rs
  • crates/minimal/src/main.rs
  • crates/minimald-rpc/src/tests.rs
  • crates/minimald/src/box_manager.rs
  • crates/minimald/src/box_manager/tests.rs
  • crates/minimald/src/rpc/tests.rs
  • scripts/session-e2e.sh

Converted to a draft: something above needs a person before review.

Review threads the coder judged:

  • 👍 valid — PRRT_kwDOPdfcxM6yTLwG: Moved interactive_task_box_name and its doc comment above the cmd_task_run doc comment, so rustdoc attaches each comment to its own function. (not posted on the thread: not an open thread on the pull request)

min creates a box named from its entry with no invented name. A second run of a held name gets -. A create under a running box's name exits 2 and names the holder. In the rendered docs, the cmd_task_run doc comment is on cmd_task_run again.

Notes from the agent: Merge of origin/main: create.rs had two conflicts. In the first, main reworded the autogen re-mint retry block, and this branch removes that block. I kept the removal. In the second, I kept this branch's box_name and added main's at_own_address, which host_line_beside now takes. cargo clippy -p minimal --all-targets is clean after the merge. The directive asked for one change, the task.rs doc comment move, and I changed nothing else. The commitlint failure is in an earlier commit on the branch ("fix(minimald): take a [box] name unchanged and clean only the entry"): one body line is longer than 100 characters. A fix needs a history rewrite, and these instructions forbid that, so the check stays red until a person rewords that commit or the PR is squash-merged with a new message.

@minimal-foundry
minimal-foundry Bot marked this pull request as draft October 31, 2026 19:16
@minimal-foundry minimal-foundry Bot added the needs-human An agent handed off; a human must act, then clear this label. Set by defer and handoffs. label Oct 31, 2026
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

The runtime will not revise this pull request again on its own: the diff is +960/-549 (1509 lines), past 3x the plan's estimate of 500 lines (est: 300 code, 200 tests, as #2762 reads now), at round 1 (the last trigger was a /revise note). A person decides now. Remove needs-human from this pull request to let /revise <note> or the automatic rounds resume, or finish #2762 by hand.

mint_into_request withdrew under request.config.name. That is None
for an activation with no --name, so the row stayed published. It now
withdraws under the name the row was registered under.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 2 of 10 on a /revise note, pushed as cbb60f15374f.

line exit tail
cargo nextest run -p minimal-client no_invented_directory_hex_name 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-243a... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-f328... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-1e55... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/workbench/crates/client-config) Compiling stdlib v0
cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-a5fa... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify min task run agent-verify exited 100 under rustc 1.99.0, which the repository does not pin (1.99.1 in rust-toolchain.toml); the PR is not a draft on that alone — CI, which honours the pin, is the gate.

ng 1 test
    test tests::every_create_session_asserts_the_daemon_build ... FAILED

    failures:

    failures:
        tests::every_create_session_asserts_the_daemon_build

    test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 676 filtered out; finished in 0.10s

  stderr ───

    thread 'tests::every_create_session_asserts_the_daemon_build' (5881) panicked at crates/minimal/src/tests.rs:360:5:
    assertion `left == right` failed
      left: ["cmd/boxes/create.rs::activate_box = asserts", "cmd/boxes/create.rs::activation_puts_the_spec_on_the_create_request = asserts nothing", "cmd/boxes/create.rs::create_from_a_subdirectory_sends_the_project_root = asserts nothing", "cmd/boxes/create.rs::unnamed_activation_withdraws_its_row_when_the_grant_mint_fails = asserts nothing", "cmd/boxes/list.rs::box_list_and_show_render_retained_records = asserts nothing", "cmd/boxes/vm_host.rs::activation_relays_no_box_id = asserts nothing", "dash/rpc.rs::activate = asserts", "dash/rpc.rs::dashboard_create_from_a_subdirectory_sends_the_project_root = asserts nothing", "dash/rpc.rs::own_ip_config = asserts nothing", "task.rs::cmd_task_run = asserts", "tests.rs::create_box_on = asserts", "tests.rs::create_request = asserts", "tests.rs::created_box_name_is_the_entry_without_a_typed_name = asserts nothing", "tests.rs::entry_name_registers_and_creates_under_one_cleaned_name = asserts nothing"]
     right: ["cmd/boxes/create.rs::activate_box = asserts", "cmd/boxes/create.rs::activation_puts_the_spec_on_the_create_request = asserts nothing", "cmd/boxes/create.rs::create_from_a_subdirectory_sends_the_project_root = asserts nothing", "cmd/boxes/list.rs::box_list_and_show_render_retained_records = asserts nothing", "cmd/boxes/vm_host.rs::activation_relays_no_box_id = asserts nothing", "dash/rpc.rs::activate = asserts", "dash/rpc.rs::dashboard_create_from_a_subdirectory_sends_the_project_root = asserts nothing", "dash/rpc.rs::own_ip_config = asserts nothing", "task.rs::cmd_task_run = asserts", "tests.rs::create_box_on = asserts", "tests.rs::create_request = asserts", "tests.rs::created_box_name_is_the_entry_without_a_typed_name = asserts nothing", "tests.rs::entry_name_registers_and_creates_under_one_cleaned_name = asserts nothing"]
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.115s] (1209/2909) minimal tests::every_daemon_connection_is_classified
        PASS [   0.963s] (1210/2909) minimal tests::attach_refuses_a_box_name_two_vms_know
        PASS [   1.366s] (1211/2909) minimal tests::box_name_resolves_vm_without_flag
────────────
     Summary [  10.938s] 1211/2909 tests run: 1210 passed, 1 failed, 24 skipped
        FAIL [   0.116s] (1208/2909) minimal tests::every_create_session_asserts_the_daemon_build
warning: 1698/2909 tests were not run due to test failure (run with --no-fail-fast to run all tests, or run with --max-fail)
error: test run failed

Outside the task's layers::

  • crates/boxes/src/lib.rs
  • crates/minimal/src/cmd/boxes/vm_host.rs
  • crates/minimal/src/cmd/mod.rs
  • crates/minimal/src/main.rs
  • crates/minimald-rpc/src/tests.rs
  • crates/minimald/src/box_manager.rs
  • crates/minimald/src/box_manager/tests.rs
  • crates/minimald/src/rpc/tests.rs
  • scripts/session-e2e.sh

Converted to a draft: something above needs a person before review.

Review threads the coder judged:

  • 👍 valid — PRRT_kwDOPdfcxM6yTu83: mint_into_request now takes the registered box_name and its failure arm withdraws with it. New test unnamed_activation_withdraws_its_row_when_the_grant_mint_fails pins that an unnamed activation's row is withdrawn. (not posted on the thread: not an open thread on the pull request)

min creates a box named from its entry and invents no name. A second run of a held name gets -. A create under a running box's name exits 2 and names the holder. Now an activation with no --name whose grant mint fails also withdraws its VM host row.

Notes from the agent: Round 2. mint_into_request takes the name the row was registered under (box_name), and its failure arm withdraws with that 10BC8 name, not request.config.name. The new test unnamed_activation_withdraws_its_row_when_the_grant_mint_fails is in create.rs. It runs a real minvmd control server, registers an own-address row for "web", and calls mint_into_request with a request that has no name. The mint fails before it reads the home directory, because the request's network mode (none) gives the proxy no stance. I checked that the test fails when the old line is restored. Merge of origin/main: nothing to do. origin/main has no commits that this branch lacks, because the merge f6c22f0 is already on the branch. The doc-comment move is already done in 3f582ac. The commitlint failure is in two commits already on the branch (f-prefixed 'take a [box] name unchanged' and 3f582ac), whose bodies have lines over 100 characters. I cannot fix them without a rewrite of pushed commits, which the rules forbid. A squash merge, or a person who rewords them, clears that check. My new commit keeps body lines under 72 characters.

@mitodrummer
Copy link
Copy Markdown
Member

/revise One line: CI tests fails minimal tests::every_create_session_asserts_the_daemon_build (crates/minimal/src/tests.rs:360), because the new unnamed_activation_withdraws_its_row_when_the_grant_mint_fails builds a CreateSession that the guard's list does not name. Add "cmd/boxes/create.rs::unnamed_activation_withdraws_its_row_when_the_grant_mint_fails = asserts nothing" to the expected list, in its sorted place. Run cargo nextest run -p minimal every_create_session_asserts_the_daemon_build. Change nothing else.

The new unit test builds a CreateSession that is never sent, so the
inventory names it as one that asserts nothing.
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 3 of 10 on a /revise note, pushed as 3f3c8e7fe510.

line exit tail
cargo nextest run -p minimal-client no_invented_directory_hex_name 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-fbdd... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling paths v0.0.1 (/workbench/crates/paths) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimal held_name_refusal_exits_2_and_names_the_holder 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-69eb... Compiling paths v0.0.1 (/workbench/crates/paths) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling args v0.0.1 (/workbench/crates/args) Compiling client-config v0.0.1 (/wo
cargo nextest run -p minimald create_session_reply_names_the_holder_of_a_held_name 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-20d7... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling client-config v0.0.1 (/workbench/crates/client-config) Compiling stdlib v0
cargo nextest run -p minimald create_session_fresh_instance_takes_the_smallest_unused_suffix 0 Applying loadouts: default Running task runtime-implement-test-3 in session task-runtime-implement-test-3-27da... Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling version v0.8.0 (/workbench/crates/version) Compiling decode v0.0.1 (/workbench/crates/decode) Compiling mlog v0.

Verify min task run agent-verify exited 100 under rustc 1.99.0, which the repository does not pin (1.99.1 in rust-toolchain.toml); the PR is not a draft on that alone — CI, which honours the pin, is the gate.

span_id": "15bd98a57fef1a00",
                "span_id": "d58efa52418c7095",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetDenyAllOptOut",
                "parent_span_id": "15bd98a57fef1a00",
                "span_id": "cd4714b1bb70357a",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetPaths",
                "parent_span_id": "15bd98a57fef1a00",
                "span_id": "ce81297ec285f9a5",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "GetRecord",
                "parent_span_id": "15bd98a57fef1a00",
                "queued_behind": "0",
                "span_id": "b367e2a644bbfd82",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "DeleteSession",
                "parent_span_id": "15bd98a57fef1a00",
                "queued_behind": "0",
                "span_id": "76a9bef61aa5eecf",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "Destroy",
                "parent_span_id": "76a9bef61aa5eecf",
                "span_id": "5e23094c10ac38ac",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
    ]
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   5.009s] (1549/2909) minimal-client box_registration::tests::resume_timeout_goes_on_and_an_absent_host_fails_closed
        PASS [   4.322s] (1550/2909) minimal-client tty_relay::tests::resume_after_drop_prints_line_and_nudges_winsize
        PASS [   6.076s] (1551/2909) minimal-client box_registration::tests::a_silent_daemon_does_not_hold_the_exit_past_the_deadline
────────────
     Summary [  39.478s] 1551/2909 tests run: 1550 passed, 1 failed, 24 skipped
        FAIL [   2.825s] (1548/2909) minimal::otel_cli exec_run_attach_and_task_run_share_the_commands_trace
warning: 1358/2909 tests were not run due to test failure (run with --no-fail-fast to run all tests, or run with --max-fail)
error: test run failed

Outside the task's layers::

  • crates/boxes/src/lib.rs
  • crates/minimal/src/cmd/boxes/vm_host.rs
  • crates/minimal/src/cmd/mod.rs
  • crates/minimal/src/main.rs
  • crates/minimald-rpc/src/tests.rs
  • crates/minimald/src/box_manager.rs
  • crates/minimald/src/box_manager/tests.rs
  • crates/minimald/src/rpc/tests.rs
  • scripts/session-e2e.sh

Converted to a draft: something above needs a person before review.

min creates a box named from its entry with no invented name. A second run of a held name with a fresh instance gets -. A create under a running box's name exits 2 and names the holder. This round also makes the create-site guard list the new row-withdrawal test, so the CI tests check passes again.

Notes from the agent: This round has one change, as the note asks: the guard list in every_create_session_asserts_the_daemon_build now has unnamed_activation_withdraws_its_row_when_the_grant_mint_fails, in its sorted place. The commitlint failure was not fixed. It comes from two commits already on the branch (f760828 and 3f582ac), and their body lines are longer than 100 characters. A fix for it needs a rewrite of those commits, and the instructions do not permit that. The new commit's lines are all shorter than 100 characters. ci-linux-native-success only aggregates the tests job, so it will pass when tests passes.

@mitodrummer mitodrummer removed the needs-human An agent handed off; a human must act, then clear this label. Set by defer and handoffs. label Oct 31, 2026
@mitodrummer
mitodrummer marked this pull request as ready for review October 31, 2026 20:25
@minimal-arch minimal-arch Bot left a comment
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

arch-review: PASS · the full ruling

The compare fixes a leak. An unnamed box has no name on its create request. So a failed grant mint withdrew nothing and left the host row published. mint_into_request now withdraws under the registered name, as the other withdrawal sites do. The new test proves the path. The change conforms to Addressing line 389, and the PASS on 3f582acd stands.

Ruled at 3f3c8e7 against gominimal/arch@8640f85e193d by claude-opus-5-5.

@minimal-foundry minimal-foundry Bot left a comment
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minimal-review — approved

Verdict APPROVE — No findings.

Panel: 3 of 3 personas ran (correctness, security, supply-chain).

@minimal-foundry minimal-foundry Bot added the review:approved minimal-review approved the current head label Oct 31, 2026
@mitodrummer mitodrummer left a comment
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed at 3f3c8e7. min invents no box name on any create path. A held name is refused with exit 2 naming the holder, from both the daemon and the VM host registration, and every refusal path withdraws its row. Only min task run asks for a fresh -. The client and the daemon share boxes::box_name::entry_box_name, so the VM host row and the box carry one name, and a user's [box] name or --name is never rewritten. The e2e script matches the new names without vacuous checks.

@mitodrummer
mitodrummer added this pull request to the merge queue Oct 31, 2026
Merged via the queue into main with commit 0911ad5 Oct 31, 2026
35 of 36 checks passed
@mitodrummer
mitodrummer deleted the agent/2762-stop-min-inventing-box-names-and-carry-the-held branch October 31, 2026 22:07
@bryan-minimal
Copy link
Copy Markdown
Member

A lab note from the day this landed, nothing to act on in the PR: two min-regress scenarios (690, 690b) went ENV on every run from this commit on, and bisecting the release pinned it here. It was the scenarios' oracle, not the daemon: they read the session's name from the "session created" record and counted hook lines by it, and since this change the record logs session_name: <anonymous> while min ls shows the entry name ("default"). Fixed on the harness side (gominimal/min-regress#27, by session id). The one thing that may be worth a look: the created record's <anonymous> where the row says default, which reads like a placeholder that outlived the minting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review:approved minimal-review approved the current head

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T58 — Stop min inventing box names and carry the held-name refusal to the user

2 participants

0