Replies: 1 comment
|
Follow-up — independent adversarial review of the reference fix We ran a separate adversarial review (critic optics: breaks / scale / brittleness / gaps) over commit One real edge worth documenting (P2): Both follow-ups are tracked in our fork's task notes. Happy to iterate if the team prefers a different contract for the malformed-namespace case. |
Uh oh!
There was an error while loading. Please reload this page.
The bug: a visible control that silently does nothing
On the Web GUI's New Session screen, the composer shows the access-level chip (shield) derived from the session's
permissionsprojection. Clicking it should open the/permissionpreset picker. It doesn't: the picker's decoration requires a materialized session binding, so on any unmaterialized surfaceavailableisfalse,optionsthrows, and the click does nothing at all. One control, two availability sources — the visible half lies about the clickable half.Once a session exists the same chip works fine, which makes the dead state harder to notice: the bug lives exactly where users configure permissions before starting.
Root cause
packages/client/ui-permission-presets/src/client/index.ts:available: session => selectOf(sessionFor(session)) !== undefined—sessionForresolves throughsessions.binding(sessionId)?.session, which isundefinedfor draft/unmaterialized sessions.permissionsprojection the host serves for these same surfaces — so it is visible exactly where the picker is not.Reference fix (on our fork)
We understand external PRs are closed right now, so we published a complete, tested fix as a fork branch for reference:
https://github.com/almazom/deepseek-harness/tree/fix/permission-picker-unmaterialized-surfaces
The picker gains a second source — the host's permission settings namespace (the same descriptor the General settings row reads and writes):
availableistruewhen either the projection select or the permission settings namespace exists;optionsreads the namespace's dynamicdefaultPresetenum throughpermissionDefaultOfand presents it with the same localized labels, active mark, and Full access risk gate as projection rows;/permission <preset>path;Tests: a new browser-plugin case drives an unmaterialized session against a served permission namespace and asserts the labeled rows, the active default, and the
settings/mutatewrite; the ghost-session cases are updated to the new contract. Focused suite: 16 files / 150 tests green;tsc -bandoxlintclean on the package. Bilingual README and an Agent Note are included in the branch.Demonstration
Fix running on a scratch
DSH_HOME(unmaterialized New Session surface throughout):Recorded from the branch at
0622714(build:web+ source-launch CLI, headless Chromium, picker-only flow, no model round).Happy to provide anything else that helps — repro details, a patch in another shape, or a discussion of the design. Into the unknown! 🐋
All reactions