An installed app can draw a gate - #260
Merged
Merged
Conversation
Gates are a pillar, and an app that shipped its own frontend could not render
one. installed.tsx is a hard either/or: a package with dist/entry.js takes its
whole namespace and loses the generic subject page — the only place outside
ship's hand-built one where InAppReview renders. It was not among the ten lent
names, so there was nothing to borrow either. The app either went without a
frontend or went without the screen where its work gets approved.
CancelRun, RetryRun and InAppReview join @druks/ui, with the InputRequest type
the ask arrives as. All three, not just the gate: they are the same category —
platform run actions keyed by a run id, sitting on the same page — and lending
one would have left the next hole.
InAppReview drops react-query. It was one optional artifact read, and an app
mounts these outside the shell's tree where no QueryClientProvider exists. The
fetch is held with the id it belongs to, so a new ask stops showing the old plan
on the render that changes it rather than after the next fetch lands. Its calls
were never the blocker the ENG-850 notes claimed: /api/artifacts/{id} and
/api/runs/{id}/resume are platform paths, so same-origin app code reaches them.
The existing tests lose their QueryClientProvider. That removal is the proof —
if anything still needed react-query, they would be red.
czpython
force-pushed
the
lend-run-controls
branch
from
August 16, 2026 14:14
970f6f5 to
9fc9cdf
Compare
czpython
enabled auto-merge (squash)
August 16, 2026 14:14
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.
Gates are a pillar, and an app that shipped its own frontend could not render one.
installed.tsxis a hard either/or: a package containingdist/entry.jstakes itswhole namespace and loses the generic subject page — the only place outside ship's
hand-built
WorkItemPagewhereInAppReviewrenders. It was not among the ten lentnames either, so there was nothing to borrow. The app either went without a frontend
or went without the screen where its work gets approved.
CancelRun,RetryRunandInAppReviewjoin@druks/ui, with theInputRequesttype the ask arrives as. All three rather than just the gate: they are the same
category — platform run actions keyed by a run id, sitting on the same page — and
lending one would have left the next hole. The pinned list goes from 10 to 13.
InAppReviewdrops react-query. It was one optional artifact read, and an app mountsthese outside the shell's tree where no
QueryClientProviderexists. The fetch isheld with the id it belongs to, so a new ask stops showing the old plan on the render
that changes it rather than after the next fetch lands.
Its calls were never the blocker the ENG-850 notes claimed.
GET /api/artifacts/{id}and
POST /api/runs/{id}/resumeare platform paths, so same-origin app code reachesthem directly — that is why lending works, not why it was blocked.
Placement stays the app's. Rendering the gate as shell chrome above the mounted app
was considered and rejected: for a gate-heavy app the gate is the screen, and a
detached band above the app's own list is worse than the app placing it inline.
Verification
The existing
InAppReviewtests lose theirQueryClientProvider. That removal is theproof — if anything still needed react-query they would be red. Three tests added for
the borrowed case: all three controls rendering with no provider at all, the artifact
read landing without react-query, and a failed artifact read leaving the gate
answerable rather than taking the panel down.
Costs the shell nothing:
maindrops 8.6 kB into the shareddruks-uichunk(6.86 → 15.58 kB). The chunk now also pulls
markdown-vendor, which the shell's ownmainalready imports statically andindex.htmlpreloads, so an app pays nothingextra for it.
Closes ENG-851.
🤖 Generated with Claude Code