Repository navigation
Console and panel: venues, doctor results, OpenShell runs and secrets shown truthfully #712
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
Goal
The web console and the /dispatch panel show what the OpenShell venue (#683, #684, #686) and the secrets features
(run.secrets, secret profiles, and #704's bundles) actually do. Nothing either surface says may be wrong for the
venue a job ran on.
Part of #650. Audited against main at 14e8f28, with #684 merged. None of the OpenShell PRs added a console or panel
feature. #700 only made the panel's sandbox pane refuse the venue.
What already works
- The venue name on a run: console
panels.mjs:787, paneldashboard.ts:4075.run-api.mjs:69accepts
openshell. - Choosing the venue on trigger add or edit, through the worker's own
parseBackendList
(write-plans.mjs:123-141). - Venue-neutral features: sizing (cpu and memory), the host budget and MCP.
- Secret profiles: add and remove, with
secretsmaps masked in diffs (console/actions.mjs:229). - Unknown refusal reasons are kept and shown raw. A sentence for each is Console: explain every outcome, a truthful overview, one vocabulary with the panel #710.
Wrong today
- The console prints
pi-dispatch sandbox <id>on every run (panels.mjs:745-752).openshellhas no
launcher. The panel already says "not reopenable" (admin/src/index.ts:2129-2154). - The panel's secrets disclosure says "the agent can read them" (
dashboard.ts:3501-3503). Onopenshell
(credentialCustody: layer) the agent holds placeholders for every value with an endpoint. - The "absent" sentences for live transcript, progress and chat blame
PI_LIVE_TRANSCRIPTS=0, expiry or not
started (console/transcript.mjs:105,panels.mjs:522). Onopenshellthe cause is the venue (no live staging
until OpenShell: steering and live transcripts over stdio, optional bind mode #686). - The panel offers its steer keys on any steer-armed run (
dashboard.ts:1405), and the planner then refuses
(job-actions.mjs:928).steerSkipped: "venue-copies"is read by nothing inadmin/. - The setup wizard offers only docker or podman (
setup-wizard.ts:691-698).podmanPreferredignoresopenshell.- With
PI_OPENSHELL_ENGINE=podmanon a host without docker, the podman answer stops at:711. - up and service install do not know the openshell venue #707 covers
upandservice install, not the wizard.
- Profiles are listed from the overlay only (
read-model.mjs:4673,secrets-command.ts:51). A profile
declared in envPI_SECRET_PROFILESis missing, and the console then says "No secret profile is declared". - A trigger pairing
run.recoverwithopenshellis accepted when written, then refused before spend on every
delivery (openshell-recover-unsupported). admin/src/index.ts:1842-1844says profile management lives on the operator command "and nowhere else". The
console'ssecret-profile-adddoes it too.
Missing
A Venues view, in the console (Fleet or Config) and the panel
For each venue it shows:
- the hosts that offer it, whether it is blessed, and the default venue and
PI_BACKEND_FLOOR; - the declared properties in words, for example "Steering: no (copy mode) · Live transcript: no · Recovery: no ·
Local folders: no · Credentials: held by the venue (placeholders in the agent)"; - the engine and gateway (
PI_OPENSHELL_ENGINE,PI_OPENSHELL_GATEWAY, copy or bind mode once OpenShell: steering and live transcripts over stdio, optional bind mode #686 lands).
Also needed:
- a venue column on the hosts table and the runs lists, and a
backendfilter field inrun-filter.mjs; - each venue's sentences come from
BACKENDS_TABLE, derived and never restated.
Doctor results
The latest pi-dispatch doctor (and --openshell) checks per host. Each worker publishes them, as names, levels and
fixed sentences, to Valkey, and the console and panel read them. Today the console says "run pi-dispatch doctor for
the reason" (panels.mjs:1173,1249).
The OpenShell run page
- the venue's policy summary: rule hosts and the count of placeholders, never values;
- the per-job providers;
- each MCP server's connection state that OpenShell policy layer: egress network policy, per-job credential providers, MCP #684 records.
Secrets, per profile and per bundle
- Each profile shows:
- its source (env or overlay);
- the resolver path, and whether it is inside
PI_SECRET_RESOLVER_ROOTS(checked before the confirm, not after;
this needswithinRootsexported from the worker package); - the triggers and projects using it;
- the last resolve: when, whether it worked, and the reason sentence if not.
- Each bundle (Project secret bundles: grant a project's env once, shared by every job, any manager or none #704) shows: its project, profile, opt-outs,
forkReviews, and the variable names of the last
resolve. Never values. - On each run: "Variables received: A, B, C (from bundle shop)", the shadowed names,
bundleSkipped, and on
openshell"placeholders: N, plain values: M". - In the panel:
/dispatch secrets add --bundle, operator-typed only as today. - A project edit refused by Project secret bundles: grant a project's env once, shared by every job, any manager or none #704's rule shows that refusal's sentence.
Proposal
- The fixes: items 1 to 8 above.
- The views: the three Missing sections.
- The wording comes from the worker's own tables:
BACKENDS_TABLE,STEER_SKIPPED_REASONS,OPENSHELL_REFUSALS,credentialCustody;- bolted by tests, so a fourth venue or a new property shows up without an admin edit.
- The secrets disclosure is custody-aware: it resolves the trigger's venue (named, or
PI_BACKENDS[0]).
Spec work
DES-OPERATOR-CONSOLEandDES-ADMIN-VIA-PI-EXTENSION: the new views.INT-RUN-RECORD(or its current name): the variable names a run received, if the record gains them in Project secret bundles: grant a project's env once, shared by every job, any manager or none #704.- Names are operator-chosen config, not attacker text, so the record stays PII-free.
- State this explicitly.
- Doctor publishing to Valkey: a new key under the existing namespace, an
INT-row, a retention rule. REQ-CONSOLE-SECURITY: UNCHANGED, checked. Nothing shows a value, a reference or a resolver's stderr.
Done when
- An
openshellrun, refused and completed, renders on both surfaces with no wrong sentence. This is checked by
fixtures:- no sandbox command;
- a custody-aware secrets line;
- live and steer absence blamed on the venue.
- The Venues view lists
local,podmanandopenshellwith their properties derived fromBACKENDS_TABLE, and a
test fails if a property has no sentence. - Profiles:
- Env and overlay profiles both list.
- A resolver outside the roots is refused before the confirm.
- Wizard and triggers:
- The wizard offers
openshellor refuses it by name. - A
run.recover+openshelltrigger is refused when written.
- The wizard offers
- Doctor results from every host show in the console.
- Bundles show per project and per run once Project secret bundles: grant a project's env once, shared by every job, any manager or none #704 lands.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request
Activity
fix(admin): console and panel sentences follow the venue a run used (#…
feat(worker): publish doctor results per host, shown in the console a…
feat(admin): a Venues view, and the venue on hosts and runs (#712)
feat(admin): OpenShell run facts and a per-profile secrets view (#712)
edgehero commentedon Oct 21, 2026
Done in four PRs:
BACKENDS_TABLEgains aservesblock (live transcript, steering, recovery, sandbox shell). A test holds it to each bundle's real options,SANDBOX_LAUNCHERSand every venue's preflight.liveSkipped.PI_SECRET_PROFILESprofiles are listed, and resolvers outside the roots are refused before the confirm.run.recoverwith a venue that cannot recover is refused at load and at write.backends: the blessed venues, the floor, and the openshell engine and gateway word./dispatchhas a VENUES view, both derived fromBACKENDS.backendfield.pi-dispatch doctorrun publishes its checks todoctor:h:<host>for 7 days. Paths, credentials and file contents are redacted, and the record says who ran it.PI_DOCTOR_INTERVAL_HOURS.openshell(mode, rule hosts from operator config, providers, placeholders) andsecretsProfile.Bundles were done by #704 part 4 (#721).
Not built, by finding: MCP connection state. #684 records none, so nothing claims it.
Residuals, named in the DES entries:
Follow-up: #725, the openshell lane's copy-mode steering assertion races the run's end.
Owed at release: a worker release carrying
serves,liveSkipped, thebackendsregistry field, doctor publishing, and theopenshellandsecretsProfilerecord fields. The admin bundle inlines the worker code.