feat(droid-control): render callouts in Showcase; decouple tctl --cwd#32
Merged
Conversation
…MB-17) Schema-valid callout effects were silently dropped by the Showcase composition. Adds CalloutOverlay (palette-aware text pill at percent anchors, content-local timing) and a render-time warning for any remaining schema-valid-but-unrendered effect types (fade-in/fade-out). Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
…graded-tail recipe (MB-18) --cwd now sets the child working directory independently on both backends (defaulting to --repo-root when unset) and is recorded in launch provenance, replacing the sh -c 'cd ... && exec' shim. Documents the degraded-tail repro recipe (slow PreToolUse hook in a scratch project) in the droid-control skill. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
factory-arman
approved these changes
Jul 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
What
Two droid-control gaps, one per ticket:
callouteffects validate against the Showcase schema but the composition never renders them — compose workers write annotation pills that silently vanish from the final video (MB-17).tctl launchrejects--cwdunless it equals--repo-root, so running one worktree'sdroid-devfrom a different project directory (e.g., a scratch project carrying repro hooks) requires ash -c 'cd … && exec droid-dev'shim that bypasses provenance (MB-18).How
CalloutOverlaycomponent renders palette-aware text pills at percent anchors, visiblet → t+durin content-local seconds, in bothsingleandside-by-sidelayouts. Showcase now also warns at render time for any schema-valid-but-unrendered effect type (fade-in/fade-outremain unrendered).--cwdnow independently sets the child working directory on both backends, defaults to--repo-rootwhen unset, and is recorded as acwd=line in launch provenance. The droid-control skill gains the degraded-tail repro recipe this unlocks (slowPreToolUsehook in a scratch project; interrupt-mid-hook strands live rows, steer-mid-hook queues the message;/hooksdev-scope toggle gotcha).Visual Evidence
Stills from the MB-17 ticket fixture (factory palette, 6 callouts), rendered post-change:
Repro Recipe
Callouts (uses the MB-17 fixture shape — any props JSON with
effects: [{"fx":"callout","t":10,"dur":4,"text":"…","at":{"x":"12%","y":"88%"}}]):cwd decoupling:
Related Issue
Closes MB-17
Closes MB-18
Reviewer Guide
Diff shape: ~50% Remotion (
CalloutOverlay.tsx+Showcase.tsxwiring), ~20%bin/tctl, ~30% skill/docs prose.Review depth: Standard — two independent additive changes, no shared surface.
Read order:
plugins/droid-control/remotion/src/components/CalloutOverlay.tsx— timing (t*fpscontent-local frames) and pill stylingplugins/droid-control/remotion/src/compositions/Showcase.tsx—calloutsfilter, overlay placement in the main-content sequence,warnUnrenderedEffectsplugins/droid-control/bin/tctl—cmd_launchcwd/repo-root resolution andwrite_provenancethird parameterplugins/droid-control/skills/droid-control/SKILL.md— degraded-tail recipe sectionOpen for pushback: callouts render as anchored pills without an arrow — the schema's
at:{x,y}is an anchor, not a target, so there is nothing to point at (CalloutOverlay.tsx:47).Risk & Impact
Low risk. Both changes are additive: props without callouts render byte-identically, and every previously-valid
tctl launchinvocation resolves to the same cwd as before (the only removed behavior is the hard error on--cwd≠--repo-root). Provenance files gain acwd=line; the only reader (cmd_provenance) cats the file verbatim.Verification
Behavior verified. Stills from the MB-17 ticket fixture (6 callouts, factory palette) at content frames 405 and 1015 show pills at the expected percent anchors; frame 855 (no active callout) is clean. Render of the fixture plus an injected
fade-ineffect printsShowcase: effect fx='fade-in' is schema-valid but not rendered by this composition.tctllive repro on both backends (tuistory + true-input/cage): childpwdprints the--cwdvalue, provenance recordsrepo_root+cwd, cwd-only launches writecwd=-only provenance, relative and nonexistent--cwddie with clear messages. verified @ 5654245Regression coverage. None added — neither the Remotion package nor
bin/tctlhas a test harness (no vitest/jest/bats anywhere in the plugin); consolidate-test-suites skip bar: no harness for the owning layer. Fallback is the manual repro above.Not tested.
fade-in/fade-outrendering (out of scope — MB-17 covers the warning only). Warning visibility onremotion still(browser console routes to an ephemeral progress buffer; it surfaces onremotion render, the production path viarender-showcase.sh).Standard validators.
tsc --noEmitclean;bash -nclean; shellcheck reports only pre-existing SC2016 (intentional single-quoted tmux template).Implementation Notes
remotion still(rolling 3-entry progress buffer) but prints per worker tab onremotion render. Keptconsole.warnin the composition rather than duplicating a rendered-effects list inrender-showcase.sh, which would drift.