8000 T5 — Versioned JSON objects and errors, secrets as references by minimal-foundry[bot] · Pull Request #2960 · gominimal/minimal · GitHub
[go: up one dir, main page]

Skip to content

T5 — Versioned JSON objects and errors, secrets as references - #2960

Merged
mitodrummer merged 4 commits into
mainfrom
agent/2891-versioned-json-objects-and-errors-secrets-as-ref
Nov 4, 2026
Merged

mitodrummer merged 4 commits into
mainfrom
agent/2891-versioned-json-objects-and-errors-secrets-as-ref

Conversation

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

T5 — Versioned JSON objects and errors, secrets as references

slice: S1
kind: task
covers: BCLI-033, BCLI-063
size: M
est: 250 code, 180 tests
executor: agent
difficulty: needs care
model: standard
diagnostics: under -o json, a failed command writes one object with code, message and hint to stderr, and nothing to stdout, pinned by machine_mode_error_object_on_stderr
observability: the command's existing tracing span records the verb, the box id it resolved and the outcome
layers:
- client:
- crates/minimal/src/cmd/output.rs (new): one writer for min/v1/<type> objects, the stderr error object, and secrets as references
- crates/minimal/src/cmd/mod.rs: dispatches the verb
- crates/minimal/src/main.rs: routes a failure under a machine output mode to the error object
- crates/minimal/Cargo.toml: adds proptest as a dev-dependency
- Cargo.lock: records proptest for the minimal crate
test: cargo nextest run -p minimal json_output_schema_per_object
test: cargo nextest run -p minimal machine_mode_error_object_on_stderr
test: cargo nextest run -p minimal secrets_rendered_as_refs_in_every_output_mode
produces:
- crates/minimal/src/cmd/output.rs
consumes: none
proof: Every -o json object carries its min/v1 schema, a failure under -o json is one error object, and no output mode prints a secret's value.

Proof

The new module minimal::output writes every -o json and -o jsonl object, alone or in a listing, with a schema field min/v1/ for the eight types. Under a machine output mode, a failed min command writes one min/v1/error line with code, message and hint to stderr, and nothing to stdout. A Secret field renders only its reference in text, json and jsonl, and a property test pins this. No command flag is new: min session policy -o json and min box audit -o jsonl fail through the new writer, and min box list and min box show do not take -o yet.

Notes from the agent: 1. The error object now always carries the hint key, as an empty string when no remedy is known. Before, the key was left out. I renamed the main.rs test machine_mode_error_line_omits_an_empty_hint to machine_mode_error_line_keeps_an_empty_hint. 2. cli.rs is not in the layers, so no verb has a new -o flag. A later task that adds -o json to box list, show and the other verbs must render through output::write_object or write_objects, with an OutputMode, and hold secrets as output::Secret. 3. The existing session-policy document (cmd/boxes/policy.rs) still writes its own min/v1/session-policy stamp. That file is outside the layers. 4. Observability: the root cmd span now records verb and outcome (ok, error, handoff). output::record_box_id records box_id on it, but nothing calls it yet, because box resolution lives in cmd/boxes.rs, outside the layers. 5. The machine_mode_error_object_on_stderr test drives main's failure path (answer_failure) with a Vec as stderr. It does not run the binary against a daemon. 6. I ran the 19 bin unit tests and the 4 output tests as well. I did not run the full crate suite or just ci.

Tests

line exit tail
cargo nextest run -p minimal json_output_schema_per_object 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-4711... 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 minimal machine_mode_error_object_on_stderr 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-fb58... 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 graph v0
cargo nextest run -p minimal secrets_rendered_as_refs_in_every_output_mode 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-9ef7... 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.

dSpan {
            name: "session.message",
            fields: {
                "kind": "GetNetSwitch",
                "parent_span_id": "8dc246d1f18ada12",
                "span_id": "d0b5ca09958bfcbe",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetDenyAllOptOut",
                "parent_span_id": "8dc246d1f18ada12",
                "span_id": "75420083504dfe6d",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetPaths",
                "parent_span_id": "8dc246d1f18ada12",
                "span_id": "ebad48926a8519f8",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "GetRecord",
                "parent_span_id": "8dc246d1f18ada12",
                "queued_behind": "0",
                "span_id": "235b822d4fa81b41",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "DeleteSession",
                "parent_span_id": "8dc246d1f18ada12",
                "queued_behind": "0",
                "span_id": "eb64e312c60740d4",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "Destroy",
                "parent_span_id": "eb64e312c60740d4",
                "span_id": "a7a653c9c96ba932",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "HandOverName",
                "parent_span_id": "eb64e312c60740d4",
                "queued_behind": "0",
                "span_id": "7ac142313a00369c",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
    ]
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 
────────────
     Summary [  39.864s] 853 tests run: 852 passed, 1 failed, 1 skipped
        FAIL [   3.001s] (853/853) minimal::otel_cli exec_run_attach_and_task_run_share_the_commands_trace
error: test run failed

Closes #2891

Residuals

Add cmd/output.rs: every -o json and -o jsonl object carries its
min/v1/<type> schema, a machine-mode failure is one min/v1/error object
on stderr with code, message and hint, and a Secret renders only its
reference in every output mode. main.rs writes its error object through
it, and the root cmd span records the verb, the box id and the outcome.
@coderabbitai
coderabbitai Bot commented Nov 4, 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: fd69dd9b-a775-421b-a33e-388a01e4f7bf

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 4, 2026 •
Copy link
Copy Markdown
Contributor Author

Approved: every review thread resolved at 938369f23363.

@mitodrummer 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 — 2 findings, 2 inline.

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

Comment thread crates/minimal/src/cmd/output.rs Resolved
Comment thread crates/minimal/src/cmd/output.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: PASS_WITH_CONDITIONS · 1 condition · the full ruling

< 8000 p dir="auto">The output writer, the stderr error object and the Secret type conform to the output conventions in architecture.md lines 381–384. One document is now wrong. docs/reference/cli-min.md lines 490–491 say that an unspecified error object has no hint. The code now always writes hint, and design line 383 shows it on every error object. C1 updates that sentence. You can merge with C1 open if an issue tracks it. Separately, nothing records box_id on the root span yet. The design does not govern that, but the task promised it, so file an issue for it.

Ruled at 4d4191a against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/minimal/src/main.rs Resolved
Comment thread crates/minimal/src/cmd/mod.rs Resolved
record_box_id had no caller, so the root span's box_id stayed empty.
Dispatch now records the box the command line names.
@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 new commit records the box argument, as the user typed it, on the root cmd span as box_id. That span exports to the user's collector by default. D9 (architecture.md line 795) says command arguments stay behind a separate flag that is off by default. The field also holds a name or prefix, not the box id that line 381 defines. Apply C1: remove the as-typed record and name an issue for the resolved-id call site. The output writer, the error object and the secret references keep their conforming status from the earlier head.

Ruled at 757d235 against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/minimal/src/cmd/mod.rs Resolved
Comment thread crates/minimal/src/cmd/mod.rs Resolved
@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/mod.rs Resolved
Comment thread crates/minimal/src/cmd/mod.rs Resolved
@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 1 of 10 on the runtime's review findings, pushed as 757d23560bb5.

line exit tail
cargo nextest run -p minimal json_output_schema_per_object 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-603a... 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 minimal machine_mode_error_object_on_stderr 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-0d53... 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.
cargo nextest run -p minimal secrets_rendered_as_refs_in_every_output_mode 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-6824... 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.

dSpan {
            name: "session.message",
            fields: {
                "kind": "GetNetSwitch",
                "parent_span_id": "298fb02c04204fcf",
                "span_id": "c21a799903f2d209",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetDenyAllOptOut",
                "parent_span_id": "298fb02c04204fcf",
                "span_id": "3d371a58f471457f",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetPaths",
                "parent_span_id": "298fb02c04204fcf",
                "span_id": "49de6d1084ac684e",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "GetRecord",
                "parent_span_id": "298fb02c04204fcf",
                "queued_behind": "0",
                "span_id": "88c2d0abbe7a7027",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "DeleteSession",
                "parent_span_id": "298fb02c04204fcf",
                "queued_behind": "0",
                "span_id": "0084daf2c2546ce8",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "Destroy",
                "parent_span_id": "0084daf2c2546ce8",
                "span_id": "6a9e5217a584d27c",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "HandOverName",
                "parent_span_id": "0084daf2c2546ce8",
                "queued_behind": "0",
                "span_id": "b4215e56ba2a5e64",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
    ]
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 
────────────
     Summary [  40.828s] 854 tests run: 853 passed, 1 failed, 1 skipped
        FAIL [   5.066s] (854/854) minimal::otel_cli exec_run_attach_and_task_run_share_the_commands_trace
error: test run failed

Review threads the coder judged:

  • 👍 valid — PRRT_kwDOPdfcxM6zY8FW: run_command in cmd/mod.rs now calls record_box_id with the box the command line names (named_box). The test root_span_box_id_is_the_named_box pins this. A resolver in attach.rs or box_verbs.rs, outside this task's layers, can record the resolved id over it. (not posted on the thread: not an open thread on the pull request)
  • 👎 invalid — PRRT_kwDOPdfcxM6zY8Fb: This is outside the task's layers. Moving min box show and the other -o json commands onto the writer needs crates/minimal/src/cmd/box_verbs.rs, list.rs and session.rs. The task names only output.rs, mod.rs, main.rs and Cargo files. This PR is groundwork for the writer, and main.rs already routes th (not posted on the thread: not an open thread on the pull request)

Every object written through crates/minimal/src/cmd/output.rs carries its min/v1/ schema. A failure under -o json writes one min/v1/error object to stderr and nothing to stdout. No output mode of the writer prints a secret's value. The cmd span now records the box that the command line names.

Notes from the agent: Round 1. The cmd span's box_id now gets the box that the command line names (box show, box audit, session attach/exec/destroy/rename/policy), as the user typed it. It is not always the resolved id. Box resolution happens in attach.rs and box_verbs.rs, which are outside this task's layers, so a later task can call output::record_box_id with the resolved id there. The writer is groundwork: no real command renders through write_object yet. Moving min box show and the other -o json commands onto it needs box_verbs.rs, list.rs and session.rs, which are outside the layers.

The box_id field held the text the user typed, and for box audit
--parent it named a different box. Remove named_box, let a drop guard
empty the root-span slot on panic or cancel, and say in the comment
that no command records box_id yet.
@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: 6 unresolved threads — minimal-arch[bot] crates/minimal/src/main.rs:771, minimal-arch[bot] crates/minimal/src/cmd/mod.rs:60, minimal-arch[bot] crates/minimal/src/cmd/mod.rs, minimal-arch[bot] crates/minimal/src/cmd/mod.rs, minimal-foundry[bot] crates/minimal/src/cmd/mod.rs:287, …. No findings.

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

@minimal-foundry
Copy link
Copy Markdown
Contributor Author

Round 2 of 10 on a failed check suite, pushed as 938369f23363.

line exit tail
cargo nextest run -p minimal json_output_schema_per_object 0 Applying loadouts: default Running task runtime-implement-test-0 in session task-runtime-implement-test-0-242f... 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 minimal machine_mode_error_object_on_stderr 0 Applying loadouts: default Running task runtime-implement-test-1 in session task-runtime-implement-test-1-b3ef... 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.
cargo nextest run -p minimal secrets_rendered_as_refs_in_every_output_mode 0 Applying loadouts: default Running task runtime-implement-test-2 in session task-runtime-implement-test-2-de8b... 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.

dSpan {
            name: "session.message",
            fields: {
                "kind": "GetNetSwitch",
                "parent_span_id": "7fe99ed742b29d8c",
                "span_id": "8970937a2b04c59e",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetDenyAllOptOut",
                "parent_span_id": "7fe99ed742b29d8c",
                "span_id": "b20e67c4926aa9da",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "GetPaths",
                "parent_span_id": "7fe99ed742b29d8c",
                "span_id": "5b7e51ccf211ccde",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "GetRecord",
                "parent_span_id": "7fe99ed742b29d8c",
                "queued_behind": "0",
                "span_id": "868d15f8ee837956",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "DeleteSession",
                "parent_span_id": "7fe99ed742b29d8c",
                "queued_behind": "0",
                "span_id": "f0496a36c1166525",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "session.message",
            fields: {
                "kind": "Destroy",
                "parent_span_id": "f0496a36c1166525",
                "span_id": "a1bdff51e223440c",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
        LoggedSpan {
            name: "sessions.manager.message",
            fields: {
                "kind": "HandOverName",
                "parent_span_id": "f0496a36c1166525",
                "queued_behind": "0",
                "span_id": "ecf01d4b7f8ae7d0",
                "trace_id": "0af7651916cd43dd8448eb211c803111",
            },
            parent: None,
            closed: true,
        },
    ]
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

  Cancelling due to test failure: 
────────────
     Summary [  44.095s] 853 tests run: 852 passed, 1 failed, 1 skipped
        FAIL [   3.180s] (853/853) minimal::otel_cli exec_run_attach_and_task_run_share_the_commands_trace
error: test run failed

Review threads the coder judged:

  • 👎 invalid — crates/minimal/src/main.rs:771: The fix is in docs/reference/cli-min.md, which is not in this task's layers (the client fi 10000 les, Cargo.toml and Cargo.lock). The code and its test agree with the design. A docs task must change that sentence.
  • 👍 valid — crates/minimal/src/cmd/mod.rs:60: Rewrote the cmd span comment: verb and outcome go on the span, and box_id stays empty until a command calls output::record_box_id, which no command does yet. I cannot file the issue from this session. The notes ask for it.
  • 👍 valid — crates/minimal/src/cmd/mod.rs: Removed the record_box_id call in run_command. The span records no command argument now.
  • 👍 valid — crates/minimal/src/cmd/mod.rs: Removed named_box and its test, so --parent no longer goes under box_id.
  • 👍 valid — crates/minimal/src/cmd/mod.rs:287: exec_run_attach_and_task_run_share_the_commands_trace passes on this branch. A drop guard (RootSpanSlot) now empties the root-span slot on panic or cancel, so the span no longer stays open.
  • 👍 valid — crates/minimal/src/cmd/mod.rs: Removed the typed-name recording. box_id stays empty until a command records the id it resolved.

Every -o json object that min writes carries its min/v1/<type> schema. A failure under -o json writes one error object with code, message and hint to stderr and nothing to stdout. No output mode prints a secret's value, only a reference to it.

Notes from the agent: Round 2. I reverted commit 757d235 (named_box) with a new commit, because three threads showed that it recorded typed text and, for --parent, a different box under box_id. run_in_root now holds the root-span slot in a drop guard, so a panic or a cancelled future empties the slot. The comment on the cmd span now says that box_id stays empty until a command calls output::record_box_id, and that no command calls it yet. A follow-up issue must add that call where cmd/boxes.rs resolves the UUIDv7. I have no gh credential, so I did not file that issue. The test-kvm and ci-linux-kvm-success excerpts show only runner setup and cleanup lines, not the failing step. This PR changes only the minimal crate, and its otel_cli trace test passes here. I could not find a cause in this diff, and this box has no /dev/kvm to reproduce the lane. docs/reference/cli-min.md is outside the layers, so I did not change it. just clippy-strict was not run.

@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_WITH_CONDITIONS · 2 conditions · the full ruling

This head removes the typed box name from the cmd span. That fixes the D9 condition from the last ruling. The writer, the error object and Secret conform to Output conventions lines 381 to 384. Two parts of the task stay open and have no issue. C1: file an issue that wires record_box_id to the resolved box id. C2: file an issue that moves the -o verbs and policy.rs onto the writer. Link both issues from the PR body.

Ruled at 938369f against gominimal/arch@7a86ec7bb3c0 by claude-opus-5-5.

Comment thread crates/minimal/src/cmd/mod.rs Resolved
Comment thread crates/minimal/src/cmd/output.rs Resolved
@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 938369f2 against BCLI-033 and BCLI-063, and the plan block in #2891.

  • Layers: the diff touches exactly the five files in its layers.
  • Error object: one stderr line, {"schema":"min/v1/error","code","message","hint"}, with the exit codes unchanged. The broken-pipe path still exits 141.
  • Secrets: Secret serializes only {"ref":…}, and Display and Debug redact the value.
  • Property test: the T1 test really generates. A mutation that writes the value fails it at once.
  • Schemas: all eight strings are exact.
  • Residuals: arch's conditions are residual-only. #2895 wires record_box_id and #2980 moves the renderers, and both are linked in the body. The cli-min.md hint wording and the duplicate-schema caveat are noted on #2980.
  • Nits, non-blocking: the hand-built schema loop at output.rs ~448 asserts its own input. ObjectType::ALL is kept by hand, and command_verb hardcodes single subverbs.

@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; @mitodrummer closed the last one. The review of 938369f23363 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 4, 2026
@mitodrummer
mitodrummer added this pull request to the merge queue Nov 4, 2026
Merged via the queue into main with commit d549b97 Nov 4, 2026
36 checks passed
@mitodrummer
mitodrummer deleted the agent/2891-versioned-json-objects-and-errors-secrets-as-ref branch November 4, 2026 03:22
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.

T5 — Versioned JSON objects and errors, secrets as references

1 participant

0