feat(desktop-policies): let organization prompts launch a named skill - #3115
feat(desktop-policies): let organization prompts launch a named skill#3115benjaminshafii wants to merge 2 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
Validation: real app, isolated Linux sandbox, matched A/BAll nine branches of this series were merged into one integration branch (
Step 4 fails identically on clean Validated frames: A real regression this caught, in this seriesBooting the real app initially failed with:
Static verification on the merged resultHonest gaps
|
Correction to my validation note aboveIn the "Honest gaps" section I wrote that local macOS That diagnosis was wrong. I tested it properly afterwards and disproved it:
So dev Electron currently opens no window on this macOS host regardless of profile, keychain, or worktree. It is pre-existing, unrelated to this series, and I have not root-caused it. The same commits do open a window in a clean Linux sandbox, which is where the validation above was run — so the core-flow evidence in this comment stands unchanged. The shared-profile collision is nonetheless real (two worktrees genuinely cannot both hold the lock, and the loser lingers with an open CDP port and no log line). That is fixed separately in #3124, which adds Flagging it because the original wording would have sent a reviewer chasing the wrong cause. |
The problem
We tell administrators that the organization prompt cards are how members discover what the platform can do. That promise is unbacked.
A prompt is free text only. There is no
skillId,pluginId, orcapabilityNameon the schema, andnormalizeDesktopPolicyDocumentstrips unknown keys. So a card reading "Find what needs my attention" just drops that sentence into the composer and hopes the agent selects the right skill.Meanwhile a binding already works by accident:
editor.tsxsetPrompt()parses a leading/slugor[skill x]into a pill, unvalidated and never mentioned in the Cloud UI.The change: formalize the accident
A prompt card can now name the skill it launches, and tells the member the truth about readiness before they click.
policyJSON column.task-suggestions.tsxandsession-empty-hero.tsx) so they cannot diverge.needs_signin/needs_admin_setup/readyvocabulary and copy. Needs-sign-in offers the route to fix it; needs-admin-setup says so plainly and does not send a member somewhere they have no permission.Compatibility is the risk, so it is tested in both directions
string[]and keep working unchanged; cards with no bound skill behave exactly as today (fill the composer, do not auto-send).Why this shape
Per-team and per-person scoping already ships and is tested (
desktop_policy_member.team_id/org_member_id), so this adds a payload field to working infrastructure rather than building a system. It is also the substrate for scheduled work later: a bound, readiness-checked prompt is exactly the thing you can put on a schedule — without building a dashboard.Verification
OpenAPI snapshot regenerated via the generator, not hand-edited. New tests cover legacy-string resolution, bound resolution, old-shape-reads-new-shape, each readiness state mapping to the right affordance, and unbound cards still only filling the composer.