# Row 303 build notes (Launchpad): R9 shows its output when rehearse makes no directory (#1810) Brief: docs/plans/2026-10-23_r9-guard-row.md (Vikunja 589). Reviewer Duckworth, gate owner Sage. Base 80793d824 (refactor after row 294 landed at d3059c2c3). Branch launchpad/row303. ## Change One added line in packages/cli/tests/stack-release.test.mjs, R9 only, at :2178: assert.ok(r.dir!==null, r.out+r.err); It sits right after R9's exit-code check and right before the `includes` check whose message builds `join(r.dir,'placeholders')`. rehearse() (:2040) sets `dir` to null when the output has no `rehearsal directory:` line, so the guard fails first and its message carries the rehearsal's output and stderr, including the FAIL line that stopped it. This is a test-only change to a pre-existing test, approved under mos-1272 and mos-1316 (mos-1422 point 2). It adds an assertion and changes none. No other line in R9 or any other test changes. The lines the brief names (:2058, :2113, :2126, :2267, :2280) put r.dir in a template, where a null prints as `null` and the message still carries r.out, so they get no guard. MANIFEST.sha256 lists the one changed path, hashed from the commit that adds this file. ## Gate Duckworth approves the diff. stack-release.test.mjs runs whole and green on Sage's gate, in a gap. Not run yet.