Skip to content

docs(demos): offer sandbox placement for /promote, now that --exclude-prompt exists - #219

Open
pdettori wants to merge 1 commit into
rossoctl:mainfrom
pdettori:feat/promote-parity-placement
Open

docs(demos): offer sandbox placement for /promote, now that --exclude-prompt exists#219
pdettori wants to merge 1 commit into
rossoctl:mainfrom
pdettori:feat/promote-parity-placement

Conversation

@pdettori

@pdettori pdettori commented Sep 3, 2026

Copy link
Copy Markdown
Member

Summary

Completes the follow-up #218 promised and #217 could not take.

#218 is merged and this branch is rebased onto it, so the diff below is this change alone.

#217 had to install /promote into real user scope, and justified it with a constraint that no
longer holds — that a command living in the project it promotes would ship itself into every bundle.
--exclude-prompt removes that, so the placement that actually buys local/remote parity becomes
available.

Both placements, and what each costs

Option A — real user scope Option B — in the sandbox
setup cp into ~/.claude/commands/ cp into the sandbox, launch HOME=$SANDBOX claude
local agent sees your whole ~/.claude exactly what the promoted run sees
cost "it behaved the same locally" is weaker evidence than it looks a re-auth, and your own skills for the duration

Option B is the more honest way to perform the demo, since parity is its whole claim. Option A stays
the easy path for following along.

/promote self-excludes rather than making the reader remember

A Context probe reports whether .claude/commands/promote.md exists in the project, and the body adds
--exclude-prompt promote only in that case. The condition matters as much as the flag: passing it
unconditionally would trip the flag's own typo guard (prompt_exclude_unmatched), which exists
precisely because an unmatched exclusion ships the prompt you meant to omit.

The reassuring part, measured

Both options produce the same bundle, so every digest quoted in the walkthrough holds for either:

Option B, no exclusion  → 19456 bytes   (the command itself travelling)
Option B, self-excluded → 12288 bytes   sha256:43b8c4c0…   ← byte-identical to Option A

Also reconciles what the rebase exposed

README.md carried #217's claim that a project-local /promote "would ship itself into every bundle"
two paragraphs above #218 documenting the flag that prevents it, plus a doubled lead-in from the two
edits landing separately. Both fixed.

The "Notes and limits" fidelity entry is rewritten rather than deleted: Option A's gap is real, it
is now a choice rather than a constraint, and whoever performs this should say which option they ran if
asked whether local matched remote.

Verification

  • make lint (9 hooks) and make test-deploy (129 checks) pass.
  • The demo is 14 passed / 0 failed against kind.
  • Option B exercised end to end from a scratch sandbox, with and without the self-exclusion, to
    produce the two byte counts above.
  • The command test gained three checks pinning the self-exclusion, including that it is conditional.

Assisted-By: Claude Code

…-prompt exists

Completes the follow-up rossoctl#218 promised and rossoctl#217 could not take. rossoctl#217 had to install /promote into
real user scope, and justified it with a constraint that no longer holds: that a command living in
the project it promotes would ship itself into every bundle. --exclude-prompt removes that, so the
placement that actually buys local/remote parity becomes available.

The runbook now offers both, and says what each costs:

- **Option A, real user scope.** Simpler. The authoring session loads your whole ~/.claude, so the
  local agent has every skill you own while the promoted run gets the sandbox's one -- which makes
  "it behaved the same locally" weaker evidence than it looks.
- **Option B, in the sandbox**, with Claude Code launched as `HOME=$SANDBOX claude`, so the local
  agent sees exactly what the promoted run will. Costs a re-auth and your own skills for the
  duration. That is the standard dev/prod-parity trade, and parity is this demo's whole claim.

/promote self-excludes rather than making the reader remember: a Context probe reports whether
`.claude/commands/promote.md` exists in the project, and the body adds `--exclude-prompt promote`
only in that case. The condition matters as much as the flag -- passing it unconditionally would trip
the flag's own typo guard (`prompt_exclude_unmatched`), which exists precisely because an unmatched
exclusion ships the prompt you meant to omit.

Measured, and recorded in the runbook because it is the reassuring part: **both options produce the
same bundle.** Option B without the exclusion is 19456 bytes -- the command itself travelling -- and
with it 12288 bytes at sha256:43b8c4c0..., byte-identical to Option A. So every digest quoted in the
walkthrough holds for either placement.

Also reconciles what the rebase exposed: README carried rossoctl#217's claim that a project-local /promote
"would ship itself into every bundle" two paragraphs above rossoctl#218 documenting the flag that prevents
it, plus a doubled lead-in from the two edits landing separately.

The "Notes and limits" fidelity entry is rewritten rather than deleted: Option A's gap is real, it is
now a choice rather than a constraint, and a performer should say which option they ran if asked
whether local matched remote.

Verification: `make lint` (9 hooks), `make test-deploy` (129 checks), the demo at 14 passed /
0 failed against kind, and Option B exercised end to end from a scratch sandbox -- with and without
the self-exclusion -- to produce the two byte counts above.

Assisted-By: Claude (Anthropic AI) <noreply@anthropic.com>
Signed-off-by: Paolo Dettori <dettori@us.ibm.com>
@pdettori
pdettori force-pushed the feat/promote-parity-placement branch from 9fd1b74 to 3d7cd59 Compare September 3, 2026 20:31
@pdettori

pdettori commented Sep 3, 2026

Copy link
Copy Markdown
Member Author

Rebased onto main now that #218 is in (e1fc6df). The diff is a single commit touching 4 files — #218's commit is gone from it — and the stacking caveat is out of the description.

Re-verified against the new base, not just carried over: make lint (9 hooks), make test-deploy (129 checks), promote.test.ts 32/32, build.test.ts 19/19, and the demo at 14 passed / 0 failed against kind.

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