Skip to content

fix(interface): collect the UI panel that was paid for, and read the library back - #79

Merged
protonspy merged 2 commits into
mainfrom
feat/the-ui-panel-you-paid-for
Sep 20, 2026
Merged

protonspy merged 2 commits into
mainfrom
feat/the-ui-panel-you-paid-for

Conversation

@protonspy

Copy link
Copy Markdown
Owner

No description provided.

…library back

`POST /create-ui-asset` completes into `GET /v2/ui-assets/{ui_asset_id}`, whose
payload carries `image_url` and no bytes anywhere. `_decode_images` reads `image`
and `images`, so it found nothing: a panel charged at thirty generations wrote
its manifest, exited 0, and left no file. Reproduced live before the fix and
verified after it, on a panel already on the account.

- A completed job that yields no bytes is fetched from the address it gives, on
  the waited-for path and on `job show`, which is what a timed-out call is told
  to run.
- `ui` becomes a group: `ui new` generates as `ui` did, `ui list` names every
  panel the account holds, and `ui show <id>` writes one out again. Both readers
  are free, so a lost file is no longer thirty generations.
- `approve` no longer gates a call whose estimate reports a price of zero.
  R6.1 asks agreement for a call that can cost money, and `character sheet` was
  asking for --yes to download a file. An absent estimate still gates.

From the security review, both before merge:

- A path parameter carrying a separator or a dot segment is refused in
  `_split_path`, for every route rather than at the third call site to remember
  it: the request that carries it carries the bearer token.
- A download named by a provider response is refused past a ceiling far above
  any asset this tool makes. The address is fetched with nobody asking, so how
  much is read is not the provider's decision.

specs/provider-core R4.9, R3.6, R3.7; specs/interface-portrait-and-font R1.5,
R1.6, R1.7; specs/asset-workspace R6.5.
Verified with scc validate --checks --pr: 1723 passed, 58 skipped, coverage
95.28%, ruff check and format clean, artifacts clean.
@protonspy
protonspy merged commit b8f9e14 into main Sep 20, 2026
2 checks passed
protonspy added a commit that referenced this pull request Sep 21, 2026
`ui` became a group in PR #79 — `ui new` generates at Pro Tools pricing, `ui
list` and `ui show` read the account back for nothing. The rename reached the
command surface, the README and the wiki, and missed every place that names `ui`
as a price: the harness block, the Pro Tools line in the entry skill, three lines
of `references/costs.md`, and one in the interface skill.

Those are what an agent reads before deciding whether to run something. Left
alone they say the group costs twenty to forty generations a call, so the two
commands that cost nothing are the ones an agent would avoid.

A test now refuses a price quoted against a name nobody can type: every backticked
command on a Pro Tools line has to be a leaf command of the CLI. Reverting one of
the lines above fails it with "the harness block prices 'ui', which is not a
command", which is what makes a third rename a red test rather than another page
left behind.

plans/the-cost-tables-name-ui-new.md.
Verified with scc validate --checks --pr: 1725 passed, 58 skipped, coverage
95.28%, ruff check and format clean, artifacts clean.
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