fix(skills): hide internal publisher identity

This commit is contained in:
Jinwoo-H
2026-08-12 17:15:59 -04:00
parent 9fb4e2303c
commit 2a0b7b2acf
7 changed files with 43 additions and 64 deletions
@@ -11,7 +11,8 @@ Implementation baselines captured by this checklist update:
merged as `8045c85dad`; encrypted physical-host credential PR `#336` merged as `8fce3298ef`;
kill-switch discovery PR `#342` merged as `c2bef2ff20fb`; production remains untouched.
Windows device-name validation PR `#343` merged as `dbb14a658cbc`; explicit disabled production
bootstrap PR `#352` merged as `2a23f6ace5`; production remains untouched.
bootstrap PR `#352` merged as `2a23f6ace5`; publisher-identity omission PR `#355` merged as
`b3213bd34d1b224d8a3b11527eceaac883965400`; production remains untouched.
Validated so far:
@@ -272,6 +273,17 @@ Validated so far:
`503`, before the mutation step. Retry `31631379891` succeeded. Independent reads verified SQL
`NEVER`/`STOPPED`, all three MIGs stable and reached at target zero with no active actions, and
the API, Auth, and Relay active-revision minimums at zero. Production was untouched.
- Cloud PR `#355` removed internal publisher and organization identifiers from anonymous skill
responses, passed every code, Terraform, and PostgreSQL 16/17 check, and merged as
`b3213bd34d1b224d8a3b11527eceaac883965400`. Guarded wake `31639920301` prepared staging. Deploy
`31640677572` promoted `orca-cloud-api-staging-00060-qay` at 100% traffic with immutable digest
`sha256:31cb0a91a7abf1f82e4de08bd31e98fbd71519adc731a005fc95f60480658f73`; authenticated and skill
candidate/canonical smoke passed. The unrelated post-promotion storage-monitor image update
lacked `iam.serviceAccounts.actAs`; the unchanged prior monitor image remains serving, and the
API promotion and verification completed successfully. Guarded sleep `31640935616` passed in
8m51s. Independent reads verified SQL `NEVER`/`STOPPED`, C1/C2/C3 stable and reached at target
zero, and the API at minimum scale zero with revision `00060-qay` retaining 100% traffic.
Production was untouched.
Rollout gate: staging infrastructure, OIDC owner identity exchange, anonymous bearer lifecycle,
owner management, browser-free desktop bundle lifecycle, privacy-safe logging, published-object
@@ -979,8 +991,8 @@ does not mean the surrounding phase is complete.
### Install experience
- [x] Show authenticated author, organization, description, version, digest, file summary, scripts,
and executable files.
- [x] Show description, version, digest, file summary, scripts, and executable files without
exposing internal publisher or organization identifiers.
- [x] Treat the package as code from its author and require an explicit install action.
- [x] Show current-machine global installation as the default.
- [x] Allow selection of connected machine, Git worktree, or plain folder workspace.
@@ -991,8 +1003,8 @@ does not mean the surrounding phase is complete.
results with actionable recovery.
- [x] Add incomplete-coverage retry.
- [x] Open deep links in inspection mode without starting installation.
- [x] Show publisher, organization, immutable version, skill count, scripts/executables, and
release notes before selection.
- [x] Show immutable version, skill count, scripts/executables, and release notes before selection;
V1 omits publisher identity from the public response and recipient UI.
- [x] Let the recipient select all or a subset, then choose local, paired runtime, WSL, or SSH and
global or workspace scope.
- [x] Preview new, unchanged, update, and conflict counts and resolve all per-skill conflicts in one
@@ -1571,9 +1583,10 @@ disconnect boundaries remain separate gates below.
and tested. The user/admin guides document the lifecycle; Cloud route, integration, restore,
and cleanup suites cover the implemented contract. Automatic one-day quarantine deletion
remains a separate time-gated infrastructure observation.
- [x] The UI identifies author, organization, scripts, and executable content before install.
Renderer coverage asserts publisher/organization identity, script and executable summaries,
digest, release notes, and long-content behavior before the primary install action.
- [x] The UI identifies scripts and executable content before install without exposing internal
publisher or organization identifiers. Renderer coverage asserts script and executable
summaries, digest, release notes, and long-content behavior before the primary install
action.
- [x] Telemetry, logs, and diagnostic bundles contain no credentials or private contents. Cloud
field-inventory and sensitive-value scans, bounded install-span attributes, and adversarial
support-bundle collection tests cover the complete first-release data path.
+19 -4
View File
@@ -254,6 +254,18 @@ relay, install, temporary home, and one-time key material were removed. Guarded
`31635145830` passed, and independent reads confirmed SQL `NEVER`/`STOPPED`, every MIG stable at
zero with no active actions, and API/Auth/Relay minimum scale zero. Supported Windows SSH and the
time-gated quarantine deletion remain open.
Cloud PR `#355` removed internal publisher and organization identifiers from recipient responses,
passed code, Terraform, and PostgreSQL 16/17 checks, and merged as
`b3213bd34d1b224d8a3b11527eceaac883965400`. Guarded wake `31639920301` prepared staging. Deploy
`31640677572` promoted `orca-cloud-api-staging-00060-qay` at 100% traffic with immutable digest
`sha256:31cb0a91a7abf1f82e4de08bd31e98fbd71519adc731a005fc95f60480658f73`; authenticated and skill
candidate/canonical smoke passed. Its unrelated post-promotion storage-monitor image update lacked
`iam.serviceAccounts.actAs`; the prior monitor image remains serving and unchanged. Guarded sleep
`31640935616` passed in 8m51s; independent reads verified SQL `NEVER`/`STOPPED`, all three Relay
MIGs stable and reached at target zero, and the API at minimum scale zero while revision
`00060-qay` retained 100% traffic.
Production remains untouched.
A final renderer lifecycle review fenced managed-install inventory by request generation so a
@@ -350,7 +362,7 @@ The review dialog shows:
- Bundle name and selected skill list.
- Skill, file, and byte counts.
- Included scripts and executable files, with an expandable review for each skill.
- Current author identity.
- The signed-in profile that will own and manage the share.
- A clear warning that anyone with the unlisted link can inspect and install the bundle.
- Optional version label and release notes.
@@ -371,8 +383,10 @@ deletion still require the owner to sign in.
### Installing
Opening a deep link launches Orca and inspects the bundle without installing it. Preview identifies
the publisher, organization, immutable version, release notes, skill count, scripts, and executable
files. The recipient can select all or a subset of the contained skills.
the immutable version, release notes, skill count, scripts, and executable files. V1 deliberately
omits publisher identity from the recipient response and UI; internal creator and tenant records
remain private authorization and management data. The recipient can select all or a subset of the
contained skills.
The destination picker supports the local machine, paired runtimes, WSL, and SSH, in global or
workspace scope. Before commit, the preview groups selected skills as new, unchanged, updates, or
@@ -1276,7 +1290,8 @@ The detailed threat register and residual release gates live in
[`docs/reference/agent-skill-sharing-threat-model.md`](./reference/agent-skill-sharing-threat-model.md).
- Treat `SKILL.md` and packaged scripts as executable code for trust messaging.
- Show author, organization, version, digest, file summary, and executable files before install.
- Show version, digest, file summary, and executable files before install without exposing internal
publisher or organization identifiers.
- Require the exact active bearer share ID for recipient resolution and every download grant;
require authentication for publication and owner management.
- Bind grants to one package version, digest, maximum byte count, and short expiration.
@@ -132,23 +132,6 @@ export function SkillBundleInstallReview(props: {
{translate('auto.components.skills.SkillBundleInstallReview.01c5a11e06', 'SHA-256')}{' '}
{manifest.bundleDigest}
</p>
{props.version.publisher ? (
<p className="break-words text-xs text-muted-foreground">
{translate(
'auto.components.skills.SkillBundleInstallReview.01c5a11e07',
'Published by Orca user'
)}{' '}
{props.version.publisher.userId}
{props.version.publisher.organizationId
? translate(
'auto.components.skills.SkillBundleInstallReview.01c5a11e08',
' in organization {{value0}}',
{ value0: props.version.publisher.organizationId }
)
: ''}
.
</p>
) : null}
{props.version.releaseNotes.trim() ? (
<p className="break-words whitespace-pre-wrap text-xs leading-5 text-muted-foreground">
{translate(
@@ -40,8 +40,7 @@ function version(): SkillCloudVersion {
}
],
packageDigest: DIGEST
},
publisher: { userId: 'author_1', organizationId: 'org_1' }
}
}
}
@@ -139,15 +138,13 @@ afterEach(() => {
})
describe('SkillInstallDialog', () => {
it('renders long Unicode identity and multiline release notes before installation', async () => {
it('renders long Unicode metadata and multiline release notes before installation', async () => {
const sharedVersion = version()
const longName = `skill-${'n'.repeat(58)}`
const organizationId = `組織-${'o'.repeat(252)}`
const releaseNotes = `First line\n${'r'.repeat(9_989)}`
sharedVersion.name = longName
sharedVersion.description = `説明 ${'d'.repeat(512)}`
sharedVersion.releaseNotes = releaseNotes
sharedVersion.publisher = { userId: 'author_1', organizationId }
const skills = installApi(vi.fn())
skills.resolveShare.mockResolvedValue({
status: 'ok',
@@ -158,14 +155,7 @@ describe('SkillInstallDialog', () => {
await inspectSkill(sharedVersion.description)
expect(screen.getByRole('heading', { name: longName })).toBeTruthy()
expect(
screen.getByText(
(_, element) =>
element?.tagName === 'P' &&
element.textContent ===
`Published by Orca user author_1 in organization ${organizationId}.`
)
).toBeTruthy()
expect(screen.queryByText(/Published by Orca user/)).toBeNull()
expect(
screen.getByText(
(_, element) =>
@@ -178,23 +178,6 @@ export function SkillInstallReview({
{translate('auto.components.skills.SkillInstallReviewContent.f72ee4022a', 'SHA-256')}{' '}
{version.packageDigest}
</p>
{version.publisher ? (
<p className="break-words text-xs text-muted-foreground">
{translate(
'auto.components.skills.SkillInstallReviewContent.9daf13c180',
'Published by Orca user'
)}{' '}
{version.publisher.userId}
{version.publisher.organizationId
? translate(
'auto.components.skills.SkillInstallReviewContent.8cedddfcd5',
' in organization {{value0}}',
{ value0: version.publisher.organizationId }
)
: ''}
.
</p>
) : null}
{version.releaseNotes.trim() ? (
<p className="break-words whitespace-pre-wrap text-xs leading-5 text-muted-foreground">
{translate(
-4
View File
@@ -4218,8 +4218,6 @@
"2a31912f14": "Orca found",
"651b7d8a57": "Local copy needs a decision",
"98ed90e523": "A skill contains instructions and may include scripts. Treat it as code from its author.",
"8cedddfcd5": " in organization {{value0}}",
"9daf13c180": "Published by Orca user",
"f72ee4022a": "SHA-256",
"3d8421ca2f": "executable",
"87137bcb8d": "scripts",
@@ -4312,8 +4310,6 @@
"01c5a11e04": "{{value0}} scripts",
"01c5a11e05": "{{value0}} executable",
"01c5a11e06": "SHA-256",
"01c5a11e07": "Published by Orca user",
"01c5a11e08": " in organization {{value0}}",
"01c5a11e09": "Release notes:",
"01c5a11e0a": "Skills contain instructions and may include scripts. Treat them as code from their author.",
"01c5a11e0b": "Skills to install",
-1
View File
@@ -24,7 +24,6 @@ export type SkillCloudVersion = {
createdAt: string
releaseNotes: string
manifest: SkillPackageManifestV1 | SkillBundleManifestV1
publisher?: { userId: string; organizationId?: string }
}
export type SkillCloudShare = {