Skip to content

Model runner depriv and deliver the unit fragment - #11307

Merged
briansrls merged 32 commits into
mainfrom
session/royal-fox-887-depriv
Sep 15, 2026
Merged

briansrls merged 32 commits into
mainfrom
session/royal-fox-887-depriv

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Model the facts a hand-placed depriv.conf carried: systemd User= from DeployRunnerPrincipal.unit_user, CTRL_RUNNER_JOB_USER from RunnerHostDeploy.job_user, CI sccache env from ci_cache_instance, DOCKER_HOST from extdeps.docker.endpoint docker_rootless_unix_endpoint.
  • The job-user XDG uid used for the rootless socket is TranscribedUncited (read obligation: id -u of the job user). It is not fleet_posix_ci_runner_user.uid, which is recorded as the wrong number.
  • runner_host_file_converge now delivers four files per host: the modeled fragment, the modeled depriv drop-in, the teardown drop-in, and the needrestart deferral. The fragment still names deploy.runner_user, not root, so a missing depriv drop-in cannot run job code as root.
  • Permit-scope cutover is not in this PR: the fragment still renders BorrowerHeldCooperativeHostFifo. Stacked on Fleet permit-scope observer over the one systemctl-show transport #11279 (merge that first).

Test plan

  • Floor includes test.claim.runner_unit_file_witness_test and test.claim.runner_host_file_converge_witness_test
  • Desired population for srv1 is four /etc paths; srv9 refuses
  • Depriv docker host is not the 1001 posix-row socket
  • Fragment for srv3 pins srv3 and still has User=briansrls

gunbc-ci-auto-heal and others added 12 commits September 13, 2026 14:21
Dissolve the leftover show-effective script scaffold: Environment/After/Wants join the existing ShowProperty handler, and the observer reports the realization those properties evidence rather than a safety verdict. Production standing stays producer-absent so hermetic workflow emit cannot mint Safe from a mock.

Co-authored-by: Cursor <cursoragent@cursor.com>
Absent fifo markers are not evidence of a jobs bound. Filling jobs_per_slot from the slot-allocation row would fabricate a Safe-capable observation. Consume cargo's env-name authority for the key.

Co-authored-by: Cursor <cursoragent@cursor.com>
…on row.

Co-authored-by: Cursor <cursoragent@cursor.com>
… owns it.

The rust.cargo path is a nickname; the floor subject cannot resolve it.

Co-authored-by: Cursor <cursoragent@cursor.com>
… file.

The indexer item grammar lists fn, not func; 0b4794c refused the file at that keyword.

Co-authored-by: Cursor <cursoragent@cursor.com>
…able.

Slot 1 is not a host: mixed per-slot realizations must not mint Observed. A present MAKEFLAGS that is not a fifo path is not absence of fifo evidence.

Co-authored-by: Cursor <cursoragent@cursor.com>
… Option.

Writer and observer now consume jobserver_makeflags_env_name, runner_unit_ctrl_jobserver_fifo_env_name, and cargo's CARGO_BUILD_JOBS name. One ShowProperty reader takes the property. Floor on 2544fa7 refused a non-exhaustive match on reads.first().

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The host standing already joins committed_slot_identities. The remaining witness only restated the helper's body.

Co-authored-by: Cursor <cursoragent@cursor.com>
Host grain goes through join_host_slot_realizations; the wet entry is that join's fleet fold, not a second name.

Co-authored-by: Cursor <cursoragent@cursor.com>
…agment.

The hand-placed depriv.conf was the unread override that made fragment delivery accidental. The drop-in is now derived from the unit-user/job-user split, the CI sccache instance, and Docker's rootless endpoint; runner-host-file converge writes that drop-in and the modeled fragment together.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot gunbai-bot Bot changed the title fleet-read-transport: dissolve the show-effective scaffold, land the permit-scope observer, deliver the runner unit fragment (depriv modeled) Model runner depriv and deliver the unit fragment Sep 13, 2026
@gunbai-bot
gunbai-bot Bot changed the base branch from main to session/royal-fox-887 September 13, 2026 20:20
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 13, 2026 20:20
… refuses.

Review 65659: User= no longer borrows srv1_ci_deploy_runner_principal, and DOCKER_HOST no longer mints a second fleet-wide 999. Unlisted hosts refuse rather than inherit a neighbour's identity.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65659 — both findings were correct; fixed on e9feeaa.

  1. User= now comes from RunnerHostDeploy.unit_user on that host. A witness poisons the field to fixture-unit and reds if srv1's principal still wins. Unmodeled unit identity is no longer borrowed from srv1_ci_deploy_runner_principal.

  2. Deleted runner_job_user_xdg_runtime_uid. The docker endpoint uid is fleet_ci_runner_reported_contradiction.reported_uid via reported_ci_runner_uid_for_host. Hosts not on that roster refuse rather than inherit a neighbour's uid. srv3/srv4 were added to that roster from this session's getent (uid 999); reported_gid stays the srv1/srv2 987 reading.

— sent from royal-fox-887

…s the uid.

review 65673: a reported contradiction is a bet, not deployment input. Production
converge omits depriv until that observation exists rather than overwriting the live drop-in.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65673 is right: reported_ci_runner_uid_for_host promoted a reported contradiction (explicitly not a ProcessReceipt) into DOCKER_HOST. DESIGN §4d: a bet consumed as a fact is the defect.

4a017a28690 deletes that helper. runner_unit_depriv_directives takes a host-bound PosixAccountObservation and admits a uid only when the occurrence is this host, FleetAccountCiRunner, and the observed name matches deploy.job_user. Production runner_host_file_desired_population passes none, so depriv is omitted from the desired set (three files: fragment, teardown, needrestart) rather than overwriting live depriv.conf without a grounded socket or refusing the rest of the converge. Witnesses render docker from fixture uid 4242 and refuse the production none path.

No production PosixAccountObservation for ghrunner is minted here — that is still the ProcessReceipt wall the contradiction row already names.

— sent from royal-fox-887

…ervation.

review 65686: shipping the fragment after swallowing RunnerUnitTextRefused was a widen.
Production still passes none; the line stops with that cause instead of writing a
partial set that is only safe if an unread depriv.conf happens to exist.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65686 is right: discarding RunnerUnitTextRefused and shipping the fragment was the §5 widen. The old warning was the correct one — a fragment without modeled depriv is only safe if an unread drop-in happens to exist.

78cfe40aa61 keeps production observation: none (still no ProcessReceipt ghrunner observation to mint). The population now refuses with that reason; CI wet already exit_failures on RunnerHostFilesDesiredRefused. Nothing is written, so the change does not claim a hand-placed depriv.conf is present. The four-file render is reachable only through runner_host_file_desired_population_observed with a fixture observation (witnesses). DOCKER_HOST is still not taken from the reported contradiction (review 65673).

— sent from royal-fox-887

Base automatically changed from session/royal-fox-887 to main September 13, 2026 21:43
gunbc-ci-auto-heal and others added 3 commits September 13, 2026 21:48
… User= on runner_user.

Parent read-fors on PR2: the XDG uid is a typed bet with an id -u read obligation, not
fleet_posix_ci_runner_user.uid, and a missing depriv drop-in still cannot run jobs as root.

Co-authored-by: Cursor <cursoragent@cursor.com>
review 65711: the figure stays as a typed bet with an id -u read obligation; converge
must not install that uid. Production depriv refuses, so the desired population does
not overwrite live depriv.conf. A CitedToAuthority fixture still renders the drop-in.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65711 is right: HEAD formed DOCKER_HOST from runner_job_user_xdg_runtime_uid.uid while that figure is TranscribedUncited, which is DESIGN §4d (a typed bet consumed as a fact) and a second copy of the same 999 as fleet_ci_runner_reported_contradiction.reported_uid.

059fc4b58b0 keeps the figure (read obligation still names id -u of RunnerHostDeploy.job_user). docker_host_from_runtime_uid_figure admits a socket path only on CitedToAuthority. Production depriv therefore refuses; runner_host_file_desired_population refuses with that cause and writes nothing, so live depriv.conf is not overwritten from the bet. Fragment User= remains deploy.runner_user. Witnesses render docker from a CitedToAuthority fixture uid 4242, not 999.

— sent from royal-fox-887

…nverge.

review 65725: an ungrounded docker uid must not stop the orphan-class pair or observe/apply.
fleet_compute_offer_for now looks up fleet_intent_offers instead of restating the four hosts.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65725 both findings.

  1. Production desired_population no longer fails closed on the uncited docker uid. Depriv is a per-file withhold (RunnerHostFileWithheld, counted in the wet receipt). Fragment + teardown drop-in + needrestart still converge; live depriv.conf is not overwritten from the TranscribedUncited bet. Not a §4b(3) drop: the orphan-class pair still has an executing delivery route.

  2. fleet_compute_offer_for folds fleet_intent_offers by supply.physical.identity instead of a four-host if-chain.

2cf0ac127e1. Fragment User= remains deploy.runner_user. DOCKER_HOST still installs only from CitedToAuthority.

— sent from royal-fox-887

…ame one home.

review 65742: no second 999, no second CTRL_RUNNER_JOB_USER, and one helper for the
grounded file list so depriv is spliced rather than the three files copied.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

review 65742 all three.

  1. runner_job_user_xdg_runtime_uid() now takes uid from fleet_ci_runner_reported_contradiction().reported_uid. No second 999. Standing stays TranscribedUncited with the id -u read obligation; DOCKER_HOST still installs only on CitedToAuthority.

  2. CTRL_RUNNER_JOB_USER lives once as runner_host_deploy.runner_job_user_env_name. Installer argv and the depriv drop-in both consume it.

  3. Grounded files are one helper (runner_host_files_with_optional_depriv); depriv is spliced, not a second copy of fragment/teardown/needrestart.

1827cfce0ea.

— sent from royal-fox-887

gunbc-ci-auto-heal and others added 3 commits September 14, 2026 00:18
The apply-route witness never reached its subject: Check has no mock_response, so the floor classified a route gap rather than a host report. Privilege, unread slots, and ancestor refusal stay as the classifiers.

Co-authored-by: Cursor <cursoragent@cursor.com>
Trailing // after the last declaration is not a source annotation; parse refused it.

Co-authored-by: Cursor <cursoragent@cursor.com>
The floor classified run_runner_host_files as a Check route gap, so restoring the witness without mock_response coverage would not restore the rung. Heal will project the ledger.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65815 — both findings.

  1. Fragment stays in the desired set when depriv is withheld. Parent's PR2 read-for is fragment User= remaining deploy.runner_user with no root path, so a missing depriv drop-in cannot run job code as root. That is the hazard the deleted runner_unit_file paragraph named (hand-placed User=root). CTRL_RUNNER_JOB_USER / sccache / DOCKER_HOST remaining in unread live depriv.conf is the permit-scope cutover, not this PR. Withholding the fragment would leave PR2 with no delivery path for the unit file the brief named.

  2. Agreed the deleted apply-route witness is a §4b(3) drop, not a // note. gunbc.rung_drop.runner_host_file_apply_route_hermetic is Standing: previous mechanically preventable, temporary mitigatable (classifiers remain), population the deleted identity, trigger shell.PosixCommandV.Check mock_response sufficient for run_runner_host_files to reach a hermetic terminal verdict. Adding that mock here would rewrite the floor_route_gap Check roster; restoring the witness without it is the same route gap that redded the floor.

6362d19ba95.

Writing the fragment without a modeled drop-in is only correct if an unread depriv.conf happens to exist. Teardown and needrestart still converge; both files land together when the figure is CitedToAuthority.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65798 and review 65815 finding 1: agreed. Production desired population no longer ships runner-unit-fragment on the TranscribedUncited arm. Depriv and fragment are both withheld; teardown drop-in and needrestart still converge. CitedToAuthority still delivers all four files, and fragment User= remains deploy.runner_user (not root) when it lands.

Finding 2 (apply-route witness): already declared as gunbc.rung_drop.runner_host_file_apply_route_hermetic on 6362d19ba95.

— sent from royal-fox-887

@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

review 65815 was against 803a02c. Both findings are in the current head a8414b20.

  1. Production no longer returns runner-unit-fragment when depriv refuses. runner_host_files_with_optional_depriv with depriv: none is teardown + needrestart only. Withheld subjects are runner-depriv-dropin and runner-unit-fragment. The cited-figure fixture still delivers four files, and fragment User= stays deploy.runner_user (not root) when it lands. Witness: production_desired_population_withholds_uncited_depriv_and_still_delivers_teardown (length(fs) == 2, fragment in withheld).

  2. Apply-route deletion is gunbc.rung_drop.runner_host_file_apply_route_hermetic (6362d19).

No further code change for this review.

— sent from royal-fox-887

gunbc-ci-auto-heal and others added 5 commits September 14, 2026 02:38
Ledger-Repair-Judged: docs/design-rung-drops.md
Ledger-Rows-Repaired: docs/design-rung-drops.md runner_host_file_apply_route_hermetic
Keep both new rung-drop roster rows (apply-route hermetic and floor-cost CPU regression).

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	dag/gunbc/rung_drop/roster.dag
#	docs/design-rung-drops.md
Ledger-Repair-Judged: docs/design-rung-drops.md
Ledger-Rows-Repaired: docs/design-rung-drops.md floor_cost_claim_qualification_unavailable
Ledger-Rows-Repaired: docs/design-rung-drops.md long_home_enrolment_margin_observed_only
Ledger-Rows-Repaired: docs/design-rung-drops.md runner_host_file_apply_route_hermetic
Ledger-Rows-Repaired: docs/design-rung-drops.md floor_cost_cpu_regression_at_constant_eval_steps
Merge left docs/design-rung-drops.md at the merge-base so the generated-artifact driver would not refuse; that dropped standing rows from the published ledger. Regen from gunbc.rung_drop at this head.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Fixed at 69371e7a825 (reply to review 66143 / /api/reviews/66143/artifacts/stdout.log).

The merge of main had to leave docs/design-rung-drops.md at the merge-base so the generated-artifact driver would not refuse a hand-merged ledger. Heal then rewrote that stale checkout, so the published ledger lost standing roster rows (long_home_enrolment_margin_observed_only, floor_cost_cpu_regression_at_constant_eval_steps) and never gained runner_host_file_apply_route_hermetic. That is the §4b(3)/§3 fork the review named.

tools.docs_projection_gate regen was run over the roster at head. Confirmed: 52 ### sections; the three requested subjects are present (the 302ms enrolment-margin line…, the hermetic apply-route witness…, CPU-time regressions at CONSTANT eval_steps…). Projection headings use RungDrop.subject, so identity keys like floor_cost_cpu do not appear as grep tokens.

— sent from royal-fox-887

…rontier.

The class already had a decl_ref-keyed row for docker_default_endpoint; returning Uri is not available until UriScheme carries unix/socket/fd.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Fixed at c3cc5584746 (reply to review 66168 / /api/reviews/66168/artifacts/stdout.log).

extdeps.docker.endpoint endpoint_string_type_frontier_rows now carries a second frontier_row_decl keyed on docker_rootless_unix_endpoint, same unbound B3 dissolution as docker_default_endpoint.

Did not return Uri: extdeps.uri UriScheme is Http/Https/Tftp/File/Ftp/Javascript/Data/Vbscript/Mailto — no unix/socket/fd arm. Stuffing a docker socket into that type would be a meaning fork, not the grounding the existing row names.

— sent from royal-fox-887

Converge already resolved runner_host_deploy_for; a second lookup minted a second unmodeled-host cause and made the fragment arm unreachable from production.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Fixed at 291fbbb2e98 (reply to review 66177 / /api/reviews/66177/artifacts/stdout.log).

gunbc_runner_unit_fragment_from_deploy takes the bound RunnerHostDeploy. runner_host_file_desired_population_from_uid_figure passes d instead of calling gunbc_runner_unit_fragment_for_host, which was a second runner_host_deploy_for on the same path. The host-only wrapper remains for callers that have not already resolved the row. Discriminating witness: the_fragment_from_deploy_uses_the_passed_row_not_a_second_lookup.

— sent from royal-fox-887

gunbc_runner_unit_fragment_for_host had no production consumer and duplicated the unmodeled-host cause. Converge keeps the one lookup and calls from_deploy.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

Fixed at 6b25eb124da (reply to review 66194 / /api/reviews/66194/artifacts/stdout.log).

Deleted gunbc_runner_unit_fragment_for_host. Routing converge back through it would restore the second host→deploy lookup [review 66177] already refused. The one production question is still runner_host_deploy_for in runner_host_file_desired_population_from_uid_figure, then gunbc_runner_unit_fragment_from_deploy with that d. The pin witness now calls from_deploy with srv3_runner_host_deploy.

— sent from royal-fox-887

@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

CI on 6b25eb1 is not a subject defect. required-witnesses-floor D0-MEASURE printed verdict=FloorClean claims_failed=0 passed=3777, and D0-ADJUDICATE printed adjudication PASSED standing=measurement_completed blockers=0. The job then failed on actions/upload-artifact FinalizeArtifact HTTP 403 from an intermediary (D0-PUBLISH of required-ci-measurement-receipt, then the TSV uploads). The witnesses aggregator failed because floor=failure on that upload, with mechanism=unestablished.

No code change. Re-ran the failed jobs of run 34850945002.

— sent from royal-fox-887

@briansrls
briansrls added this pull request to the merge queue Sep 14, 2026
Merged via the queue into main with commit df490cd Sep 15, 2026
6 of 8 checks passed
@briansrls
briansrls deleted the session/royal-fox-887-depriv branch September 15, 2026 00:12
@briansrls
briansrls restored the session/royal-fox-887-depriv branch September 15, 2026 00:14
briansrls pushed a commit that referenced this pull request Sep 15, 2026
THE MISSING RUN HAD A CAUSE AND IT WAS NOT A DROPPED WEBHOOK. After `8598871fe` no workflow run was
created for twenty minutes while the repository was demonstrably healthy -- other branches started
runs at 01:37, 01:47 and 01:54. The API says why: `mergeable=false`. GitHub builds
`refs/pull/N/MERGE` for a `pull_request` run, a conflicted PR has no such ref, and the workflow
therefore had nothing to run against. The branch was 68 commits behind.

FOUR CONFLICTS, TWO OF THEM SEMANTIC.

`runner_host_deploy.dag`: main's #11307 added `unit_user` to `RunnerHostDeploy`; this branch had
replaced those rows with `RunnerHostSpec` plus an admission constructor. Git merged the four
`unit_user: "root"` literals INTO the spec rows -- textually plausible, semantically wrong, and it
would not have compiled, because the field was declared on the deploy and not on the spec. It is
threaded through the seam instead: `unit_user` is a PRINCIPAL, and `RunnerHostSpec`'s own header
says principals live there ("a host's address, its principals and its GitHub app are true of srv2
exactly as they are of srv1"). Only `runner_count` was ever the capacity fact.

`runner_unit_file_witness_test.dag`: main's 118 new lines read `srv1_runner_host_deploy` and
`srv3_runner_host_deploy` directly, and this branch deleted both rows. They now read the admission
through `wt_srv1_deploy`, which already existed for exactly this, plus the srv3 twin it needed. The
unadmitted fixture row gains `unit_user` for the same reason the production rows did.

`ROADMAP.md` and `.github/workflows/fleet-converge.yml`: the generated-artifact merge driver refused
both and printed the regeneration recipe, which is the behaviour it was repaired into. Regenerated.

THE FIRST REGENERATION PRODUCED `# roadmap unavailable` AND THE TREE WAS NEVER BROKEN. It reported
`unknown variant acceptance_node_remains_superseded, expected acceptance_node_reopens_active_frontier`
against a `roadmap_model.dag` that is BYTE-IDENTICAL to main, whose coproduct carries both arms, and
whose fixture main is green on. The cause was the instrument: the merge brought 23 changed files
under `src/v1` and the binary predated all of them. Rebuilt -- which needed `cargo clean -p
v1-compiler` and `CARGO_INCREMENTAL=0`, because the incremental cache had gone inconsistent across
the change and linked with `undefined reference to drop_in_place<serde_core::private::content::Content>`
-- and the same command then produced a 57,680-byte projection carrying both roadmap rows.

Committing the first attempt would have failed the docs projection gate, which IS in the required
gate roster, on a defect that did not exist. `gunbc.recurring_failure_mode` already owns this class
and this repository's own memory of it says to verify the instrument before citing it; the lesson is
that a 68-commit merge is precisely when the instrument changes underneath you.

Two prose citations naming the deleted `srv4_runner_host_deploy` are repaired in passing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7tG7JyxfKEDUtBUYuEw6m
briansrls pushed a commit that referenced this pull request Sep 15, 2026
… see

The floor refused at PREPARATION on the merged head -- `floor refused: modules_resolved=3056
modules_excluded=2`, no witness executed, no cost artifact produced. Run 34923353966.

PARSE IS NOT TYPECHECK, and that is the whole lesson of this commit. `v1_src_dag_parse` reported the
merged tree clean because every file is syntactically well formed; what it cannot see is a record
literal missing a field its type declares, or a match that stopped being exhaustive because someone
else's coproduct grew an arm. Both classes are exactly what a 68-commit merge produces, and both were
invisible until the floor typechecked the corpus.

SIX LITERALS LOST A FIELD. #11307 added `unit_user` to `RunnerHostDeploy`; this branch's
`wt-unadmitted` fixture row is copied into six witness modules and predates it. Each gains the field.

ONE MATCH LOST EXHAUSTIVENESS, AND IT IS THE DELETE-FIRST CENSUS WORKING RATHER THAN A DEFECT.
`runner_host_file_converge` matches `runner_host_deploy_for` over two arms; this branch added a third,
`RunnerHostDeployRefused`, for a host whose admitted width refuses. The compiler refused loudly at the
consumer, which is what a fail-closed substrate is supposed to do when an authority grows a case.

THE NEW ARM CARRIES THE WIDTH REFUSAL'S OWN CAUSE rather than reusing the unmodeled-host message, and
the distinction is load-bearing: srv2 IS modeled -- address, principals and app all declared -- and
what refuses is its width. A reader told "no runner deploy row" would go looking for a missing
declaration that is present.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7tG7JyxfKEDUtBUYuEw6m
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant