diff --git a/docs/agent-skill-sharing-implementation-checklist.md b/docs/agent-skill-sharing-implementation-checklist.md index 4f4125cc3ff..42af7bf2a9f 100644 --- a/docs/agent-skill-sharing-implementation-checklist.md +++ b/docs/agent-skill-sharing-implementation-checklist.md @@ -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. diff --git a/docs/agent-skill-sharing-installation-plan.md b/docs/agent-skill-sharing-installation-plan.md index 6f0ed5496d0..80b3ede1993 100644 --- a/docs/agent-skill-sharing-installation-plan.md +++ b/docs/agent-skill-sharing-installation-plan.md @@ -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. diff --git a/src/renderer/src/components/skills/SkillBundleInstallReview.tsx b/src/renderer/src/components/skills/SkillBundleInstallReview.tsx index 153b68f141c..15a7679f3b8 100644 --- a/src/renderer/src/components/skills/SkillBundleInstallReview.tsx +++ b/src/renderer/src/components/skills/SkillBundleInstallReview.tsx @@ -132,23 +132,6 @@ export function SkillBundleInstallReview(props: { {translate('auto.components.skills.SkillBundleInstallReview.01c5a11e06', 'SHA-256')}{' '} {manifest.bundleDigest}

- {props.version.publisher ? ( -

- {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 } - ) - : ''} - . -

- ) : null} {props.version.releaseNotes.trim() ? (

{translate( diff --git a/src/renderer/src/components/skills/SkillInstallDialog.test.tsx b/src/renderer/src/components/skills/SkillInstallDialog.test.tsx index f3aa80a0da2..9e90251b539 100644 --- a/src/renderer/src/components/skills/SkillInstallDialog.test.tsx +++ b/src/renderer/src/components/skills/SkillInstallDialog.test.tsx @@ -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) => diff --git a/src/renderer/src/components/skills/SkillInstallReviewContent.tsx b/src/renderer/src/components/skills/SkillInstallReviewContent.tsx index d4d7c38a6dc..b67ae6f69e3 100644 --- a/src/renderer/src/components/skills/SkillInstallReviewContent.tsx +++ b/src/renderer/src/components/skills/SkillInstallReviewContent.tsx @@ -178,23 +178,6 @@ export function SkillInstallReview({ {translate('auto.components.skills.SkillInstallReviewContent.f72ee4022a', 'SHA-256')}{' '} {version.packageDigest}

- {version.publisher ? ( -

- {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 } - ) - : ''} - . -

- ) : null} {version.releaseNotes.trim() ? (

{translate( diff --git a/src/renderer/src/i18n/locales/en.json b/src/renderer/src/i18n/locales/en.json index 9a320c2d83a..53d35c67417 100644 --- a/src/renderer/src/i18n/locales/en.json +++ b/src/renderer/src/i18n/locales/en.json @@ -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", diff --git a/src/shared/skill-cloud-contract.ts b/src/shared/skill-cloud-contract.ts index 55034fc9f79..bec7978e456 100644 --- a/src/shared/skill-cloud-contract.ts +++ b/src/shared/skill-cloud-contract.ts @@ -24,7 +24,6 @@ export type SkillCloudVersion = { createdAt: string releaseNotes: string manifest: SkillPackageManifestV1 | SkillBundleManifestV1 - publisher?: { userId: string; organizationId?: string } } export type SkillCloudShare = {