8000 T64 — Carry and validate a box's timeout in its spec, with the exec timeout's grammar moved into mfile by minimal-foundry[bot] · Pull Request #3122 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

T64 — Carry and validate a box's timeout in its spec, with the exec timeout's grammar moved into mfile - #3122

Merged
agent-137 merged 7 commits into
mainfrom
agent/3110-carry-and-validate-a-box-s-timeout-in-its-spec-w
Nov 7, 2026
Merged

agent-137 merged 7 commits into
mainfrom
agent/3110-carry-and-validate-a-box-s-timeout-in-its-spec-w

Conversation

@minimal-foundry
@minimal-foundry minimal-foundry Bot commented Nov 7, 2026 •
Copy link
Copy Markdown
Contributor

T64 — Carry and validate a box's timeout in its spec, with the exec timeout's grammar moved into mfile

slice: S4
kind: task
covers: none
size: M
est: 140 code, 150 tests
executor: agent
difficulty: routine
model: standard
diagnostics: a bad timeout exits 3 naming the key and the entry; the --timeout refusal is unchanged
observability: none: parsing and a spec field
layers:
- parser:
- crates/mfile/src/duration.rs (new): parse_timeout_secs moved from the CLI, grammar and refusal text unchanged; spec_timeout adds 0 as none
- crates/mfile/src/lib.rs: mod line
- crates/minimal/src/cli.rs: --timeout uses mfile's parser; parse_exec_timeout removed
test: cargo nextest run -p mfile duration_takes_seconds_minutes_hours_and_refuses_the_rest
test: cargo nextest run -p mfile spec_timeout_zero_is_none
test: cargo nextest run -p minimal box_exec_timeout_flag_requests_exec_timeout
test: cargo nextest run -p minimal exec_timeout_returns_124_from_exec_and_wait_exec
- spec:
- crates/mfile/src/spec.rs: execution.timeout on BoxSpec, read from the entry through spec_timeout
- crates/mfile/src/lib.rs: validate refuses a bad timeout; timeout is not an unknown key
- crates/mfile/src/expand.rs: timeout takes the duration shape
test: cargo nextest run -p mfile spec_carries_timeout_under_execution
test: cargo nextest run -p mfile invalid_timeout_exit3_names_key_and_entry
test: cargo nextest run -p mfile timeout_entry_key_is_not_reported_unknown
test: cargo nextest run -p mfile invalid_key_exit3_names_key_and_layer
produces:
- crates/mfile/src/duration.rs
consumes:
- crates/mfile/src/spec.rs
proof: An entry's timeout reaches its Box Spec as execution.timeout, a bad value exits 3 naming the key and the entry, and min box exec --timeout takes and refuses exactly what it did before.
depends on:
- blocked by #2415

Proof

A [session] or [tasks.] timeout such as "8h" or 90 now appears in the Box Spec as execution.timeout, in whole seconds. A timeout of zero leaves the key out. A bad value, such as timeout = "2 days" in [tasks.lint], refuses the load with exit 3 and the message "[tasks.lint] in minimal.toml sets timeout to a string that is not a duration, but timeout takes ... Fix the value." min box exec --timeout uses mfile::duration::parse_timeout_secs, with the same grammar and the same refusal text as before.

Notes from the agent: The timeout refusal reuses Error::InvalidSpecKey with WrongShape, because error.rs is not in the layers. The expected-shape words are new text: 'a whole number of seconds, or a string of a whole number followed by s, m or h, such as "30s", "5m" or "1h"'. The expand path (Shape::Duration replaces Shape::StrOrInt, which had no other user) gives the same words. So the existing invalid_key_exit3_names_key_and_layer case for timeout = 1.5 now expects these words, and that test gets a new case for a bad timeout string. expansion_order_and_merge_rules in expand.rs used label strings such as "defaults" as timeout values. The duration shape refuses them, so the test now uses distinct valid durations (1s to 8s). expand::value_words is now pub(crate), so spec_timeout can name a value of the wrong type. BoxSpec::build now takes the entry's extra map in place of hooks_on_resume, to stay inside clippy's argument limit. hooks_on_resume is still reported as an unknown task or [session] field. This task covered only timeout. SPEC_READ_ENTRY_KEYS in lib.rs is the place to add hooks_on_resume. No daemon reads execution.timeout yet. The whole mfile suite passes: 119 of 119.

Tests

line exit tail
cargo nextest run -p mfile duration_takes_seconds_minutes_hours_and_refuses_the_rest 0 Applying loadouts: default Running task runtime-implement-test-0 in box runtime-implement-test-0-1... 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 (/workbench/crat
cargo nextest run -p mfile spec_timeout_zero_is_none 0 Applying loadouts: default Running task runtime-implement-test-1 in box runtime-implement-test-1-1... Finished 'test' profile [unoptimized] target(s) in 0.32s ──────────── Nextest run ID 5ad22dfc-0dc8-47c7-af0b-6132457ef8b2 with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p minimal box_exec_timeout_flag_requests_exec_timeout 0 Applying loadouts: default Running task runtime-implement-test-2 in box runtime-implement-test-2-1... 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 (/workbench/crat
cargo nextest run -p minimal exec_timeout_returns_124_from_exec_and_wait_exec 0 Applying loadouts: default Running task runtime-implement-test-3 in box runtime-implement-test-3-1... 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.0.1 (/workbe
cargo nextest run -p mfile spec_carries_timeout_under_execution 0 Applying loadouts: default Running task runtime-implement-test-4 in box runtime-implement-test-4-1... Finished 'test' profile [unoptimized] target(s) in 0.46s ──────────── Nextest run ID b5ff6060-414e-478b-b869-50ab3a9de053 with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile invalid_timeout_exit3_names_key_and_entry 0 Applying loadouts: default Running task runtime-implement-test-5 in box runtime-implement-test-5-1... Finished 'test' profile [unoptimized] target(s) in 0.34s ──────────── Nextest run ID be046813-db8c-4663-b740-ae1a6022dff3 with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile timeout_entry_key_is_not_reported_unknown 0 Applying loadouts: default Running task runtime-implement-test-6 in box runtime-implement-test-6-1... Finished 'test' profile [unoptimized] target(s) in 0.35s ──────────── Nextest run ID 2790a0bf-43cc-409c-be78-fab0ab99d78f with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile invalid_key_exit3_names_key_and_layer 0 Applying loadouts: default Running task runtime-implement-test-7 in box runtime-implement-test-7-1... Finished 'test' profile [unoptimized] target(s) in 0.33s ──────────── Nextest run ID 1e669253-2f6d-4cc7-a738-fa4c411baf14 with nextest profile: default Starting 2 tests across 1 binary (120

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.

eserved_range
        PASS [   0.014s] ( 666/1068) minimal resolver::tests::range_step_custody_failure_resurfaces_the_advisory
        PASS [   0.010s] ( 667/1068) minimal resolver::tests::range_step_custody_follows_the_program_the_plist_names
        PASS [   0.169s] ( 668/1068) minimal resolver::tests::privileged_copy_refuses_a_source_swapped_after_render
        PASS [   0.012s] ( 669/1068) minimal resolver::tests::range_step_custody_is_root_owned
        PASS [   0.014s] ( 670/1068) minimal resolver::tests::range_step_custody_walks_every_path_component
        PASS [   0.018s] ( 671/1068) minimal resolver::tests::resolver_file_hook_parses_nameserver_and_port
        PASS [   0.013s] ( 672/1068) minimal resolver::tests::resolver_file_hook_states_its_gaps
        PASS [   0.011s] ( 673/1068) minimal resolver::tests::routing_domain_hook_states_its_gaps
        PASS [   0.013s] ( 674/1068) minimal resolver::tests::routing_domain_hook_finds_the_carrying_link_and_its_port
        PASS [   0.013s] ( 675/1068) minimal resolver::tests::session_advisory_without_a_port_stays_quiet
        PASS [   0.022s] ( 676/1068) minimal resolver::tests::session_advisory_agrees_with_the_hook_it_detected
        PASS [   0.011s] ( 677/1068) minimal resolver::tests::session_start_points_at_finalize_install_without_the_advisory
        PASS [   0.016s] ( 678/1068) minimal resolver::tests::the_app_bundle_layout_matches_packaging
        PASS [   0.011s] ( 679/1068) minimal resolver::tests::the_bundle_record_mirrors_the_probe
        FAIL [   0.052s] ( 680/1068) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
  stdout ───

    running 1 test
    test resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling ... FAILED

    failures:

    failures:
        resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling

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

  stderr ───

    thread 'resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling' (3889) panicked at crates/minimal/src/resolver.rs:7689:9:
    the liveness proof still ran at the holder's port
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.325s] ( 681/1068) minimal resolver::tests::privileged_copy_refuses_a_user_writable_ancestor
        PASS [   1.140s] ( 682/1068) minimal resolver::tests::finalize_install_undo_succeeds_on_a_clean_host
        PASS [   0.632s] ( 683/1068) minimal resolver::tests::the_lists_two_queries_run_under_one_deadline
────────────
     Summary [  12.321s] 683/1068 tests run: 682 passed, 1 failed, 1 skipped
        FAIL [   0.052s] ( 680/1068) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
warning: 385/1068 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

Base

The base branch moved while the coder worked and was merged in before the tests ran. These files changed on BOTH sides since the branch point — read them first, because a rewrite from a stale reading can undo a merge without a conflict:

  • crates/mfile/src/expand.rs

Residuals

Closes #3110

min box exec --timeout now parses through mfile::duration, with the same
grammar and refusal text. spec_timeout reads an entry's timeout, and
takes zero as no timeout.
The Box Spec reads timeout from [session] or a task through
spec_timeout. validate refuses a bad value with exit 3, naming the key
and the entry, and the load no longer reports timeout as unknown.
@coderabbitai
coderabbitai Bot commented Nov 7, 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: 2a964350-54aa-4c4d-9ba4-c097df82f551

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

@minimal-foundry
minimal-foundry Bot commented Nov 7, 2026 •
Copy link
Copy Markdown
Contributor Author

Approved: every review thread resolved at 1cf44c461732.

@agent-137 resolved the last thread, which releases the approval this review had withheld.

Nothing to do.

@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: 2 of 3 personas ran (correctness, security); did not complete: supply-chain.

Comment thread crates/mfile/src/duration.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 · 2 conditions · the full ruling

The grammar move and the spec field fit the design. Section Box Spec line 1097 makes zero the same as no timeout, and the change does this. Two edits in crates/mfile/src/spec.rs are necessary. The spec writes execution.timeout as integer seconds, but box.toml line 252 writes a string. Add this to the v0 exceptions that #2410 ends (C1). No daemon reads the box timeout yet, and the load does not warn about it now. Link the enforcement issue in the BoxSpec::timeout doc, as hooks_on_resume links #3111 (C2).

Ruled at 1019c22 against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/mfile/src/spec.rs Resolved
Comment thread crates/mfile/src/spec.rs Resolved
@agent-137
Copy link
Copy Markdown
Member

/revise Arch conditions C1 and C2 (arch_rulings 1039), in substance. C1: in crates/mfile/src/spec.rs, remove execution.timeout from the list of box.toml tables in the module doc (line 9), and add this bullet to the v0 exceptions that #2410 ends: "execution.timeout is a whole number of seconds, not the box.toml duration string, and a spec with no timeout leaves the key out in place of \"0\"." Keep the integer serialization. C2: in the BoxSpec::timeout doc comment, state that the spec stores and round-trips the value but the daemon does not read this key yet, and link #3114 (T66), the task that makes minimald end the box at its timeout (BOX-037), as hooks_on_resume links #3111. In the PR body, list #3114 as a residual. Change nothing else.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

That /revise is held, not dropped. A coder is already running on #3110. 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.

execution.timeout is written as a TOML integer, which is an i64. A
duration string past i64::MAX seconds now exits 3 naming the key and
the entry, instead of passing validation. The --timeout grammar is
unchanged.
@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.

APPROVE withheld: 3 unresolved threads — minimal-foundry[bot] crates/mfile/src/duration.rs:73, minimal-arch[bot] crates/mfile/src/spec.rs:9, minimal-arch[bot] crates/mfile/src/spec.rs:81.

minimal-review — advisory review

Verdict COMMENT — No findings.

Panel: 2 of 3 personas ran (correctness, supply-chain); did not complete: security.

@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 timeout grammar, the flat entry key, the exit-3 refusal and "0" as none all conform to the design. The new i64::MAX bound makes every validated value serializable. One gap remains. The Box Spec writes timeout as a duration string (architecture.md line 1097, box.toml line 252). This change writes execution.timeout as whole seconds. The module doc in crates/mfile/src/spec.rs lists each v0 departure from box.toml that #2410 ends, but this one is not on the list. Add it as C1 states.

Ruled at 78a76ea against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/mfile/src/spec.rs Resolved
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 1 of 10 on the runtime's review findings, pushed as 78a76ea84102.

8BD0
line exit tail
cargo nextest run -p mfile duration_takes_seconds_minutes_hours_and_refuses_the_rest 0 Applying loadouts: default Running task runtime-implement-test-0 in box runtime-implement-test-0-1... 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 (/workbench/crat
cargo nextest run -p mfile spec_timeout_zero_is_none 0 Applying loadouts: default Running task runtime-implement-test-1 in box runtime-implement-test-1-1... Finished 'test' profile [unoptimized] target(s) in 0.37s ──────────── Nextest run ID 19bb1e7b-0593-4571-9b57-3ecef456ffda with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p minimal box_exec_timeout_flag_requests_exec_timeout 0 Applying loadouts: default Running task runtime-implement-test-2 in box runtime-implement-test-2-1... 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 (/workbench/crat
cargo nextest run -p minimal exec_timeout_returns_124_from_exec_and_wait_exec 0 Applying loadouts: default Running task runtime-implement-test-3 in box runtime-implement-test-3-1... 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.0.1 (/workbe
cargo nextest run -p mfile spec_carries_timeout_under_execution 0 Applying loadouts: default Running task runtime-implement-test-4 in box runtime-implement-test-4-1... Finished 'test' profile [unoptimized] target(s) in 0.37s ──────────── Nextest run ID 69bd47f8-8d91-4bcb-8dd7-c1ee44887e41 with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile invalid_timeout_exit3_names_key_and_entry 0 Applying loadouts: default Running task runtime-implement-test-5 in box runtime-implement-test-5-1... Finished 'test' profile [unoptimized] target(s) in 0.31s ──────────── Nextest run ID 8e7a25b9-fd0d-47e8-a22d-82f11854122c with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile timeout_entry_key_is_not_reported_unknown 0Applying loadouts: default Running task runtime-implement-test-6 in box runtime-implement-test-6-1... Finished 'test' profile [unoptimized] target(s) in 0.39s ──────────── Nextest run ID 080db6c0-70dd-40df-9410-516709d4ff9b with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile invalid_key_exit3_names_key_and_layer 0 Applying loadouts: default Running task runtime-implement-test-7 in box runtime-implement-test-7-1... Finished 'test' profile [unoptimized] target(s) in 0.31s ──────────── Nextest run ID 86dd9064-e89a-499a-a2af-919e96432b2c with nextest profile: default Starting 2 tests across 1 binary (120

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.

d_range
        PASS [   0.013s] ( 666/1068) minimal resolver::tests::range_step_custody_failure_resurfaces_the_advisory
        PASS [   2.046s] ( 667/1068) minimal mint::tests::a_refused_client_key_is_replaced_and_registered_before_the_mint
        PASS [   0.013s] ( 668/1068) minimal resolver::tests::range_step_custody_follows_the_program_the_plist_names
        PASS [   0.011s] ( 669/1068) minimal resolver::tests::range_step_custody_is_root_owned
        PASS [   0.012s] ( 670/1068) minimal resolver::tests::resolver_file_hook_parses_nameserver_and_port
        PASS [   0.016s] ( 671/1068) minimal resolver::tests::range_step_custody_walks_every_path_component
        PASS [   0.012s] ( 672/1068) minimal resolver::tests::resolver_file_hook_states_its_gaps
        PASS [   0.013s] ( 673/1068) minimal resolver::tests::routing_domain_hook_finds_the_carrying_link_and_its_port
        PASS [   0.013s] ( 674/1068) minimal resolver::tests::routing_domain_hook_states_its_gaps
        PASS [   0.019s] ( 675/1068) minimal resolver::tests::session_advisory_agrees_with_the_hook_it_detected
        PASS [   0.011s] ( 676/1068) minimal resolver::tests::session_start_points_at_finalize_install_without_the_advisory
        PASS [   0.027s] ( 677/1068) minimal resolver::tests::session_advisory_without_a_port_stays_quiet
        PASS [   0.034s] ( 678/1068) minimal resolver::tests::the_app_bundle_layout_matches_packaging
        PASS [   0.013s] ( 679/1068) minimal resolver::tests::the_bundle_record_mirrors_the_probe
        FAIL [   0.090s] ( 680/1068) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
  stdout ───

    running 1 test
    test resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling ... FAILED

    failures:

    failures:
        resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling

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

  stderr ───

    thread 'resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling' (6712) panicked at crates/minimal/src/resolver.rs:7689:9:
    the liveness proof still ran at the holder's port
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.315s] ( 681/1068) minimal resolver::tests::privileged_copy_refuses_a_user_writable_ancestor
        PASS [   1.162s] ( 682/1068) minimal resolver::tests::finalize_install_undo_succeeds_on_a_clean_host
        PASS [   0.629s] ( 683/1068) minimal resolver::tests::the_lists_two_queries_run_under_one_deadline
────────────
     Summary [  12.479s] 683/1068 tests run: 682 passed, 1 failed, 1 skipped
        FAIL [   0.090s] ( 680/1068) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
warning: 385/1068 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

Review threads the coder judged:

  • 👍 valid — crates/mfile/src/duration.rs:73: spec_timeout now refuses a timeout string past i64::MAX seconds as 'a duration that is too long', so validation exits 3 and the TOML spec always holds the value. The cap is in spec_timeout and not duration_secs, so --timeout is unchanged. Tests pin both cases.

An entry's timeout reaches its Box Spec as execution.timeout. A bad value exits 3 and names the key and the entry. That includes a duration string past i64::MAX seconds, which the TOML spec cannot hold. min box exec --timeout takes and refuses exactly what it did before.

Notes from the agent: Revise round 1. The cap is in spec_timeout, not in duration_secs. A cap in duration_secs changes what min box exec --timeout takes, and the task keeps that grammar unchanged. The new refusal word is 'a duration that is too long'.

The spec writes whole seconds, not the box.toml duration string. The
timeout doc now says no daemon reads the key yet and links #3114.
@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 change conforms to the Box Spec [execution] timeout line (architecture.md line 1097, box.toml line 252) and to the flat entry key (line 1306). A zero timeout is none. A bad value refuses the load with exit 3 before a spec is built. The last commit closes the open items from the ruling on 78a76ea8. It lists the integer-seconds encoding as a v0 exception (#2410). It also states that the daemon does not enforce the box timeout yet (#3114). Both stay open as filed residuals.

Ruled at 900c869 against gominimal/arch@7a86ec7bb3c0 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.

APPROVE withheld: 4 unresolved threads — minimal-foundry[bot] crates/mfile/src/duration.rs:73, minimal-arch[bot] crates/mfile/src/spec.rs, minimal-arch[bot] crates/mfile/src/spec.rs:84, minimal-arch[bot] crates/mfile/src/spec.rs.

minimal-review — advisory review

Verdict COMMENT — No findings.

Panel: 2 of 3 personas ran (security, supply-chain); did not complete: correctness.

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

line exit tail
cargo nextest run -p mfile duration_takes_seconds_minutes_hours_and_refuses_the_rest 0 Applying loadouts: default Running task runtime-implement-test-0 in box runtime-implement-test-0-1... 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 (/workbench/crat
cargo nextest run -p mfile spec_timeout_zero_is_none 0 Applying loadouts: default Running task runtime-implement-test-1 in box runtime-implement-test-1-1... Finished 'test' profile [unoptimized] target(s) in 0.43s ──────────── Nextest run ID a9c94f4c-9d7f-4965-acd8-b601b475039b with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p minimal box_exec_timeout_flag_requests_exec_timeout 0 .13 Compiling heapless v0.9.3 Compiling httpdate v1.0.3 Compiling opentelemetry-otlp v0.33.0 Compiling tracing-appender v0.2.5 Compiling graph v0.0.1 (/workbench/crates/graph) Compiling argon2 v0.6.0-rc.8 Compiling derive_more-impl v2.1.1 Compiling strum v0.28.0 Compiling
cargo nextest run -p minimal exec_timeout_returns_124_from_exec_and_wait_exec 0 Applying loadouts: default Running task runtime-implement-test-3 in box runtime-implement-test-3-1... 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.0.1 (/workbe
cargo nextest run -p mfile spec_carries_timeout_under_execution 0 Applying loadouts: default Running task runtime-implement-test-4 in box runtime-implement-test-4-1... Finished 'test' profile [unoptimized] target(s) in 0.51s ──────────── Nextest run ID 7533e367-c538-4d1f-94d0-985b986dd4e8 with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile invalid_timeout_exit3_names_key_and_entry 0 Applying loadouts: default Running task runtime-implement-test-5 in box runtime-implement-test-5-1... Finished 'test' profile [unoptimized] target(s) in 0.44s ──────────── Nextest run ID 1a59d31a-1336-47e3-a0a1-32d37f6d6d8a with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile timeout_entry_key_is_not_reported_unknown 0 Applying loadouts: default Running task runtime-implement-test-6 in box runtime-implement-test-6-1... Finished 'test' profile [unoptimized] target(s) in 0.45s ──────────── Nextest run ID dbc67633-2351-4309-b3f8-3a96747dffb5 with nextest profile: default Starting 1 test across 1 binary (121
cargo nextest run -p mfile invalid_key_exit3_names_key_and_layer 0 Applying loadouts: default Running task runtime-implement-test-7 in box runtime-implement-test-7-1... Finished 'test' profile [unoptimized] target(s) in 0.43s ──────────── Nextest run ID 0f4a3b11-67f9-4fca-bd99-0534974b4b5e with nextest profile: default Starting 2 tests across 1 binary (120

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.

d_range
        PASS [   0.012s] ( 666/1068) minimal resolver::tests::range_step_custody_failure_resurfaces_the_advisory
        PASS [   0.011s] ( 667/1068) minimal resolver::tests::range_step_custody_follows_the_program_the_plist_names
        PASS [   0.011s] ( 668/1068) minimal resolver::tests::range_step_custody_is_root_owned
        PASS [   2.061s] ( 669/1068) minimal mint::tests::a_refused_client_key_is_replaced_and_registered_before_the_mint
        PASS [   0.012s] ( 670/1068) minimal resolver::tests::range_step_custody_walks_every_path_component
        PASS [   0.014s] ( 671/1068) minimal resolver::tests::resolver_file_hook_parses_nameserver_and_port
        PASS [   0.011s] ( 672/1068) minimal resolver::tests::resolver_file_hook_states_its_gaps
        PASS [   0.011s] ( 673/1068) minimal resolver::tests::routing_domain_hook_finds_the_carrying_link_and_its_port
        PASS [   0.011s] ( 674/1068) minimal resolver::tests::routing_domain_hook_states_its_gaps
        PASS [   0.020s] ( 675/1068) minimal resolver::tests::session_advisory_agrees_with_the_hook_it_detected
        PASS [   0.018s] ( 676/1068) minimal resolver::tests::session_advisory_without_a_port_stays_quiet
        PASS [   0.012s] ( 677/1068) minimal resolver::tests::session_start_points_at_finalize_install_without_the_advisory
        PASS [   0.011s] ( 678/1068) minimal resolver::tests::the_app_bundle_layout_matches_packaging
        PASS [   0.011s] ( 679/1068) minimal resolver::tests::the_bundle_record_mirrors_the_probe
        FAIL [   0.059s] ( 680/1068) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
  stdout ───

    running 1 test
    test resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling ... FAILED

    failures:

    failures:
        resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling

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

  stderr ───

    thread 'resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling' (8658) panicked at crates/minimal/src/resolver.rs:7689:9:
    the liveness proof still ran at the holder's port
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.313s] ( 681/1068) minimal resolver::tests::privileged_copy_refuses_a_user_writable_ancestor
        PASS [   1.170s] ( 682/1068) minimal resolver::tests::finalize_install_undo_succeeds_on_a_clean_host
        PASS [   0.628s] ( 683/1068) minimal resolver::tests::the_lists_two_queries_run_under_one_deadline
────────────
     Summary [  13.850s] 683/1068 tests run: 682 passed, 1 failed, 1 skipped
        FAIL [   0.059s] ( 680/1068) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
warning: 385/1068 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

Review threads the coder judged:

An entry's timeout reaches its Box Spec as execution.timeout, a bad value exits 3 naming the key and the entry, and min box exec --timeout takes and refuses exactly what it did before. The spec.rs module doc now lists execution.timeout as a v0 exception (whole seconds, key left out for none), and the BoxSpec::timeout doc says the daemon does not read the key yet and links #3114.

Notes from the agent: Revise round 2: doc comments only in crates/mfile/src/spec.rs, per arch conditions C1 and C2. The integer serialization is unchanged. For C1 I used the bullet wording from the /revise note, which is the later of the two wordings. Put #3114 (T66, BOX-037) in the PR body as a residual. I ran only one test line this round because the change touches comments only.

@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 — every review thread is resolved; @agent-137 closed the last one. The review of 900c869261d0 withheld this approval on the threads open then. Posted as a comment, as the review itself was; the check and the label carry it.

@minimal-foundry minimal-foundry Bot added the review:approved minimal-review approved the current head label Nov 7, 2026
@agent-137
agent-137 added this pull request to the merge queue Nov 7, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Nov 7, 2026
@agent-137
Copy link
Copy Markdown
Member

/revise Merge main into this branch. It conflicts in crates/mfile/src/lib.rs only, after #3105 (T17, legacy tables: mod legacy, Error::LegacyTable/InteractiveTask, legacy::settle) merged. Keep both sides: this PR's mod duration, the timeout validation in File::validate and the warn_unknown_fields change, and main's legacy additions. Change nothing else; keep the body's residual #3114.

…validate-a-box-s-timeout-in-its-spec-w

# Conflicts:
#	crates/mfile/src/lib.rs
@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 merge of #3105 makes [defaults.session] the session table, and legacy::settle reads it into file.session. File::check still labels a bad timeout there as "[session] in minimal.toml". A file that writes only [defaults.session] gets a refusal that names a table it does not contain. Line 1173 of the design makes [defaults.session] a layer of its own. Change the label and pin it in a test, as C1 says.

Ruled at 9f37293 against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/mfile/src/lib.rs Resolved
Comment thread crates/mfile/src/lib.rs Resolved
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

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

Resolved conflicts in: crates/mfile/src/lib.rs

line exit tail
cargo nextest run -p mfile duration_takes_seconds_minutes_hours_and_refuses_the_rest 0 Applying loadouts: default Running task runtime-implement-test-0 in box runtime-implement-test-0-1... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling version v0.8.0 (/workbench/crates/version) Compiling paths v0.0.1 (/workbench/crates/p
cargo nextest run -p mfile spec_timeout_zero_is_none 0 Applying loadouts: default Running task runtime-implement-test-1 in box runtime-implement-test-1-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 10.32s ──────────── Nextest run ID
cargo nextest run -p minimal box_exec_timeout_flag_requests_exec_timeout 0 Applying loadouts: default Running task runtime-implement-test-2 in box runtime-implement-test-2-1... 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 (/workbench/crat
cargo nextest run -p minimal exec_timeout_returns_124_from_exec_and_wait_exec 0 Applying loadouts: default Running task runtime-implement-test-3 in box runtime-implement-test-3-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling mfile v0.0.1 (/workbench/crates/mfile) Compiling mlog v0.0.1 (/workbenc
cargo nextest run -p mfile spec_carries_timeout_under_execution 0 Applying loadouts: default Running task runtime-implement-test-4 in box runtime-implement-test-4-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 10.33s ──────────── Nextest run ID
cargo nextest run -p mfile invalid_timeout_exit3_names_key_and_entry 0 Applying loadouts: default Running task runtime-implement-test-5 in box runtime-implement-test-5-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 9.92s ──────────── Nextest run ID
cargo nextest run -p mfile timeout_entry_key_is_not_reported_unknown 0 Applying loadouts: default Running task runtime-implement-test-6 in box runtime-implement-test-6-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 10.84s ──────────── Nextest run ID
cargo nextest run -p mfile invalid_key_exit3_names_key_and_layer 0 Applying loadouts: default Running task runtime-implement-test-7 in box runtime-implement-test-7-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 10.79s ──────────── Nextest run ID

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.

m_the_plist_names
        PASS [   0.009s] ( 674/1074) minimal resolver::tests::range_step_custody_is_root_owned
        PASS [   0.010s] ( 675/1074) minimal resolver::tests::range_step_custody_walks_every_path_component
        PASS [   0.010s] ( 676/1074) minimal resolver::tests::resolver_file_hook_parses_nameserver_and_port
        PASS [   0.010s] ( 677/1074) minimal resolver::tests::resolver_file_hook_states_its_gaps
        PASS [   0.010s] ( 678/1074) minimal resolver::tests::routing_domain_hook_finds_the_carrying_link_and_its_port
        PASS [   0.011s] ( 679/1074) minimal resolver::tests::routing_domain_hook_states_its_gaps
        PASS [   0.013s] ( 680/1074) minimal resolver::tests::session_advisory_agrees_with_the_hook_it_detected
        PASS [   0.013s] ( 681/1074) minimal resolver::tests::session_advisory_without_a_port_stays_quiet
        PASS [   0.010s] ( 682/1074) minimal resolver::tests::session_start_points_at_finalize_install_without_the_advisory
        PASS [   2.060s] ( 683/1074) minimal mint::tests::a_refused_client_key_is_replaced_and_registered_before_the_mint
        PASS [   0.010s] ( 684/1074) minimal resolver::tests::the_app_bundle_layout_matches_packaging
        PASS [   0.010s] ( 685/1074) minimal resolver::tests::the_bundle_record_mirrors_the_probe
        PASS [   0.220s] ( 686/1074) minimal resolver::tests::privileged_copy_refuses_a_user_writable_ancestor
        PASS [   0.010s] ( 687/1074) minimal resolver::tests::the_resolve_module_is_looked_up_under_glibcs_module_name
        FAIL [   0.061s] ( 688/1074) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
  stdout ───

    running 1 test
    test resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling ... FAILED

    failures:

    failures:
        resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling

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

  stderr ───

    thread 'resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling' (8742) panicked at crates/minimal/src/resolver.rs:7689:9:
    the liveness proof still ran at the holder's port
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.021s] ( 689/1074) minimal resolver::tests::vm_host_answerer_line_names_the_ho
10BC8
lder
        PASS [   0.966s] ( 690/1074) minimal resolver::tests::finalize_install_undo_succeeds_on_a_clean_host
        PASS [   0.625s] ( 691/1074) minimal resolver::tests::the_lists_two_queries_run_under_one_deadline
────────────
     Summary [  12.106s] 691/1074 tests run: 690 passed, 1 failed, 1 skipped
        FAIL [   0.061s] ( 688/1074) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
warning: 383/1074 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

After the merge of main, an entry's timeout still reaches its Box Spec as execution.timeout. A bad value still exits 3 and names the key and the entry. min box exec --timeout takes and refuses the same values as before. The legacy-table additions from main are also present.

Notes from the agent: Revise round 3: merged origin/main. The only conflict marker was in the File::validate doc comment in crates/mfile/src/lib.rs. The resolution keeps both sides: it lists Error::InteractiveTask from main and Error::InvalidSpecKey from this PR. mod duration, mod legacy, legacy::settle, the timeout check in check() and the warn_unknown_fields change all merged without conflict and are kept. No other change. The other files in the merge commit come from main.

@agent-137
Copy link
Copy Markdown
Member

/revise Arch condition C1 (arch_rulings 1046, head 9f37293), in substance. In crates/mfile/src/lib.rs File::check (about line 1203), change the layer passed to check_entry_timeout for self.session from "[session] in minimal.toml" to "[defaults.session] in minimal.toml". After legacy::settle, file.session holds the [defaults.session] layer, whether it was read from that table or from the legacy [session] table, and the new label matches expand::layer_words for Layer::DefaultsType. In invalid_timeout_exit3_names_key_and_entry, add the case [defaults.session]\ntimeout = "2 days"\n, expecting "[defaults.session] in minimal.toml sets timeout to a string that is not a duration", and make the two existing [session] cases expect the [defaults.session] label too. Change nothing else.

After legacy::settle, file.session holds the [defaults.session] layer, read from that table or from the legacy [session] table. The refusal now names that table, as expand::layer_words does.
@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

This head conforms. The session timeout refusal now names [defaults.session], the layer that the design gives at line 1251. The [session] table from before reads into the same layer, and its rename hint prints before the refusal. The rest of the change is the same as the PASS on 900c8692. Issue #3114 owns the daemon work that reads execution.timeout.

Ruled at 1cf44c4 against gominimal/arch@7a86ec7bb3c0 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 — approval withheld

Verdict COMMENT — APPROVE withheld: 2 unresolved threads — minimal-arch[bot] crates/mfile/src/lib.rs, minimal-arch[bot] crates/mfile/src/lib.rs:3238. No findings.

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

@minimal-foundry minimal-foundry Bot removed the review:approved minimal-review approved the current head label Nov 7, 2026
@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 — every review thread is resolved; @agent-137 closed the last one. The review of 1cf44c461732 withheld this approval on the threads open then. Posted as a comment: the App cannot approve its own pull request; the check and the label carry it.

@minimal-foundry minimal-foundry Bot added the review:approved minimal-review approved the current head label Nov 7, 2026
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 4 of 10 on a /revise note, pushed as 1cf44c461732.

line exit tail
cargo nextest run -p mfile duration_takes_seconds_minutes_hours_and_refuses_the_rest 0 Applying loadouts: default Running task runtime-implement-test-0 in box runtime-implement-test-0-1... Compiling args v0.0.1 (/workbench/crates/args) Compiling ot v0.0.1 (/workbench/crates/ot) Compiling version v0.8.0 (/workbench/crates/version) Compiling paths v0.0.1 (/workbench/crates/p
cargo nextest run -p mfile spec_timeout_zero_is_none 0 Applying loadouts: default Running task runtime-implement-test-1 in box runtime-implement-test-1-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 13.09s ──────────── Nextest run ID
cargo nextest run -p minimal box_exec_timeout_flag_requests_exec_timeout 0 Applying loadouts: default Running task runtime-implement-test-2 in box runtime-implement-test-2-1... 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 (/workbench/crat
cargo nextest run -p minimal exec_timeout_returns_124_from_exec_and_wait_exec 0 Applying loadouts: default Running task runtime-implement-test-3 in box runtime-implement-test-3-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling stdlib v0.0.22 (/workbench/crates/stdlib) Compiling mfile v0.0.1 (/workbench/crates/mfile) Compiling mlog v0.0.1 (/workbenc
cargo nextest run -p mfile spec_carries_timeout_under_execution 0 Applying loadouts: default Running task runtime-implement-test-4 in box runtime-implement-test-4-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 14.23s ──────────── Nextest run ID
cargo nextest run -p mfile invalid_timeout_exit3_names_key_and_entry 0 Applying loadouts: default Running task runtime-implement-test-5 in box runtime-implement-test-5-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 12.65s ──────────── Nextest run ID
cargo nextest run -p mfile timeout_entry_key_is_not_reported_unknown 0 Applying loadouts: default Running task runtime-implement-test-6 in box runtime-implement-test-6-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 13.41s ──────────── Nextest run ID
cargo nextest run -p mfile invalid_key_exit3_names_key_and_layer 0 Applying loadouts: default Running task runtime-implement-test-7 in box runtime-implement-test-7-1... Compiling version v0.8.0 (/workbench/crates/version) Compiling mfile v0.0.1 (/workbench/crates/mfile) Finished 'test' profile [unoptimized] target(s) in 12.95s ──────────── Nextest run ID

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.

     PASS [   0.011s] ( 675/1074) minimal resolver::tests::range_step_custody_walks_every_path_component
        PASS [   0.010s] ( 676/1074) minimal resolver::tests::resolver_file_hook_parses_nameserver_and_port
        PASS [   0.012s] ( 677/1074) minimal resolver::tests::resolver_file_hook_states_its_gaps
        PASS [   0.010s] ( 678/1074) minimal resolver::tests::routing_domain_hook_finds_the_carrying_link_and_its_port
        PASS [   0.010s] ( 679/1074) minimal resolver::tests::routing_domain_hook_states_its_gaps
        PASS [   0.014s] ( 680/1074) minimal resolver::tests::session_advisory_agrees_with_the_hook_it_detected
        PASS [   2.086s] ( 681/1074) minimal mint::tests::a_refused_client_key_is_replaced_and_registered_before_the_mint
        PASS [   0.011s] ( 682/1074) minimal resolver::tests::session_start_points_at_finalize_install_without_the_advisory
        PASS [   0.021s] ( 683/1074) minimal resolver::tests::session_advisory_without_a_port_stays_quiet
        PASS [   0.020s] ( 684/1074) minimal resolver::tests::the_app_bundle_layout_matches_packaging
        PASS [   0.010s] ( 685/1074) minimal resolver::tests::the_bundle_record_mirrors_the_probe
        PASS [   0.263s] ( 686/1074) minimal resolver::tests::privileged_copy_refuses_a_user_writable_ancestor
        PASS [   0.011s] ( 687/1074) minimal resolver::tests::the_resolve_module_is_looked_up_under_glibcs_module_name
        PASS [   0.015s] ( 688/1074) minimal resolver::tests::vm_host_answerer_line_names_the_holder
        FAIL [   0.067s] ( 689/1074) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
  stdout ───

    running 1 test
    test resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling ... FAILED

    failures:

    failures:
        resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling

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

  stderr ───

    thread 'resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling' (8817) panicked at crates/minimal/src/resolver.rs:7689:9:
    the liveness proof still ran at the holder's port
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 3 tests still running
        PASS [   0.012s] ( 690/1074) minimal resolver::tests::vm_host_answerer_line_says_dns_service_or_host_daemon
        PASS [   1.108s] ( 691/1074) minimal resolver::tests::finalize_install_undo_succeeds_on_a_clean_host
        PASS [   0.626s] ( 692/1074) minimal resolver::tests::the_lists_two_queries_run_under_one_deadline
────────────
     Summary [  13.652s] 692/1074 tests run: 691 passed, 1 failed, 1 skipped
        FAIL [   0.067s] ( 689/1074) minimal resolver::tests::the_answerer_facts_ride_beside_a_down_proxy_sibling
warning: 382/1074 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

Review threads the coder judged:

  • 👍 valid — PRRT_kwDOPdfcxM60xeiP: File::check now passes "[defaults.session] in minimal.toml" to check_entry_timeout for self.session, which matches expand::layer_words for Layer::DefaultsType. (not posted on the thread: not an open thread on the pull request)
  • 👍 valid — PRRT_kwDOPdfcxM60xeiR: Added a [defaults.session] timeout = "2 days" case, and the two legacy [session] cases now expect the [defaults.session] label. (not posted on the thread: not an open thread on the pull request)

An entry's timeout reaches its Box Spec as execution.timeout. A bad value exits 3 and names the key and the entry. A bad session timeout now names [defaults.session] in minimal.toml, for both the new table and the legacy [session] table. min box exec --timeout takes and refuses exactly what it did before.

Notes from the agent: Round 4 makes only the change that condition C1 asks for. The session timeout refusal label in File::check changes to [defaults.session] in minimal.toml. invalid_timeout_exit3_names_key_and_entry gets a [defaults.session] case, and the two [session] cases now expect the same label. Nothing else changed.

@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.

Approved.

@agent-137
agent-137 added this pull request to the merge queue Nov 7, 2026
Merged via the queue into main with commit c54e368 Nov 7, 2026
35 of 36 checks passed
@agent-137
agent-137 deleted the agent/3110-carry-and-validate-a-box-s-timeout-in-its-spec-w branch November 7, 2026 17:44
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.

T64 — Carry and validate a box's timeout in its spec, with the exec timeout's grammar moved into mfile

2 participants

0