Deferred findings from the review rounds on PR #593 (login-outcome-return, triaged at head b0b701d4fef97670fdc29bb17caa1a3c4763ea96). Triage classified every one as a preference, not a blocker; none affects behaviour, exit codes, or output. They are recorded here so they are not lost.
N1 - src/core/cli/remote_commands.js:522: unreadable --token-file reports reason: 'login_failed' rather than 'usage'.
Deferred because the two review rounds disagreed and round 2's reasoning holds: the catch also covers stdin read failure (not a usage error), and the branch exits 1 while every 'usage' return in the file exits 2, so relabelling would trade one inconsistency for a sharper one. Vocabulary only; classifyLoginFailure maps both to 'abandoned' either way. If someone wants 'usage' here, split the tokenFile arm from the stdin arm and keep exit codes consistent.
N2 - src/core/remote/types.d.ts:159-161: awkward "except for daemon_incomplete" clause on LoginOutcome.
The clause reads like an exception to the exitCode === 0 iff reason === 'ok' invariant but actually confirms it (remote_commands.js only reaches daemon_incomplete under daemonCode !== 0). Docs wording only; suggested phrasing from round 1: "every non-ok reason is non-zero; daemon_incomplete carries the installer's code rather than 1".
N3 - empty glosses on the two new [tests] refs: test/core/remote-login-command.test.js:127 and test/core/cli/wizard/join.test.js:108.
Deferred because the empty-gloss pattern is repo-wide (59 occurrences) and is being cleaned up corpus-wide (see #624); not this PR's debt.
N4 - stale prose mentions of runRemoteLogin at src/core/cli/wizard/steps.js:33 and test/core/cli/wizard/join.test.js:13.
Deferred because both sentences still read true at the level they are written (runRemoteLogin still exists as a one-line adapter over remoteLogin). Fix opportunistically when touching those files.
N5 - no test pins reason: 'connected_elsewhere' on the unreadable arm of the D4 gate (src/core/cli/remote_commands.js:628).
test/core/remote-login-command.test.js:206 covers the origins arm only. The unreadable-arm reason was a merge-resolution judgement call (recorded in the round-2 review); a test would pin the answer either way. No caller branches on the reason today, so this is a test nicety, not a defect.
Governance note (also non-blocking, but flagged for the human at the merge button): the round-2 fix commit b0b701d4 rewrote a rationale paragraph under #no-prose-control-flow in llp/0179-login-lane-returns-its-outcome.decision.md, whose header says Status: Accepted. Triage judged this acceptable rather than blocking: LLP 0179 is introduced by PR #593 itself and does not exist on master, so no settled corpus record was rewritten; the doc only becomes a settled record when it lands. The decision (classify on reason codes, keep the tee) is untouched; only a factually false sentence about WizardJoinResult.detail was corrected, and merging a known-false rationale into an Accepted record would be the worse outcome for record integrity. The orchestrator's <!-- neutral-note: accepted-llp-edit --> comment on the PR leaves the final call visible to the merging human; if they prefer the strict reading, the alternative is reverting the llp/0179 hunk and carrying the correction in a small extending LLP.
Related open design question recorded in the round-2 review, no action needed now: if a future caller ever branches on connected_elsewhere to give switch-server advice, the unreadable-layer arm should get its own reason (via a new LLP extending 0179 #outcome).
Backlink: #593 (review rounds at 7cf0a434 and 925ca2aa, fixes pushed in b0b701d4).
Deferred findings from the review rounds on PR #593 (
login-outcome-return, triaged at headb0b701d4fef97670fdc29bb17caa1a3c4763ea96). Triage classified every one as a preference, not a blocker; none affects behaviour, exit codes, or output. They are recorded here so they are not lost.N1 -
src/core/cli/remote_commands.js:522: unreadable--token-filereportsreason: 'login_failed'rather than'usage'.Deferred because the two review rounds disagreed and round 2's reasoning holds: the
catchalso covers stdin read failure (not a usage error), and the branch exits 1 while every'usage'return in the file exits 2, so relabelling would trade one inconsistency for a sharper one. Vocabulary only;classifyLoginFailuremaps both to'abandoned'either way. If someone wants'usage'here, split the tokenFile arm from the stdin arm and keep exit codes consistent.N2 -
src/core/remote/types.d.ts:159-161: awkward "except fordaemon_incomplete" clause onLoginOutcome.The clause reads like an exception to the
exitCode === 0iffreason === 'ok'invariant but actually confirms it (remote_commands.jsonly reachesdaemon_incompleteunderdaemonCode !== 0). Docs wording only; suggested phrasing from round 1: "every non-okreason is non-zero;daemon_incompletecarries the installer's code rather than 1".N3 - empty glosses on the two new
[tests]refs:test/core/remote-login-command.test.js:127andtest/core/cli/wizard/join.test.js:108.Deferred because the empty-gloss pattern is repo-wide (59 occurrences) and is being cleaned up corpus-wide (see #624); not this PR's debt.
N4 - stale prose mentions of
runRemoteLoginatsrc/core/cli/wizard/steps.js:33andtest/core/cli/wizard/join.test.js:13.Deferred because both sentences still read true at the level they are written (
runRemoteLoginstill exists as a one-line adapter overremoteLogin). Fix opportunistically when touching those files.N5 - no test pins
reason: 'connected_elsewhere'on the unreadable arm of the D4 gate (src/core/cli/remote_commands.js:628).test/core/remote-login-command.test.js:206covers the origins arm only. The unreadable-arm reason was a merge-resolution judgement call (recorded in the round-2 review); a test would pin the answer either way. No caller branches on the reason today, so this is a test nicety, not a defect.Governance note (also non-blocking, but flagged for the human at the merge button): the round-2 fix commit
b0b701d4rewrote a rationale paragraph under#no-prose-control-flowinllp/0179-login-lane-returns-its-outcome.decision.md, whose header saysStatus: Accepted. Triage judged this acceptable rather than blocking: LLP 0179 is introduced by PR #593 itself and does not exist onmaster, so no settled corpus record was rewritten; the doc only becomes a settled record when it lands. The decision (classify on reason codes, keep the tee) is untouched; only a factually false sentence aboutWizardJoinResult.detailwas corrected, and merging a known-false rationale into an Accepted record would be the worse outcome for record integrity. The orchestrator's<!-- neutral-note: accepted-llp-edit -->comment on the PR leaves the final call visible to the merging human; if they prefer the strict reading, the alternative is reverting thellp/0179hunk and carrying the correction in a small extending LLP.Related open design question recorded in the round-2 review, no action needed now: if a future caller ever branches on
connected_elsewhereto give switch-server advice, the unreadable-layer arm should get its own reason (via a new LLP extending 0179 #outcome).Backlink: #593 (review rounds at
7cf0a434and925ca2aa, fixes pushed inb0b701d4).