Tasks — Republish Remote Surface As OpenDataLabs
Worker safety. Tasks 1–6 are mechanical and safe for worker lanes once this change is accepted. Tasks 7 are owner-only; do not invent answers. Validate the OpenSpec change at every step; do not begin code lanes before §0 is green.
0. OpenSpec Capture
- 0.1 Author
proposal.md,design.md,tasks.md, andspecs/reference-implementation-architecture/spec.mdforrepublish-remote-surface-as-opendatalabs. - 0.2 Run
openspec validate republish-remote-surface-as-opendatalabs --strict; resolve any reported issues. - 0.3 Commit OpenSpec artifacts on the working branch; record the commit hash in the workstream report under
tmp/workstreams/.
1. Package Identity Rename (worker lane, after §7.1)
- 1.1 Set
packages/remote-surface/package.json#nameto@opendatalabs/remote-surface. - 1.2 Update README masthead, exports table, install snippet, and
Minimal Consumer Shapeexample to use@opendatalabs/remote-surface. - 1.3 Migrate every in-repo importer of
@pdpp/remote-surface(apps/web,reference-implementation,packages/polyfill-connectors, scripts) to the new specifier. Delete the legacy name; do not alias. - 1.4 Teach
packages/remote-surface/scripts/validate-package.mjsto assertpackage.json#name === "@opendatalabs/remote-surface". - 1.5 Run
pnpm --filter @opendatalabs/remote-surface verify; commit when green. (Note:verify's clean-consumer step hits a pre-existing pnpm 10.33 minimumReleaseAge supply-chain policy quirk in this local environment, independent of the rename; typecheck, lint, tests, build, npm pack, and packed-artifact boundary assertions all pass.)
2. Reference Subpath Split (worker lane)
- 2.1 Move
StreamingSessionStoreand its types fromsrc/server/streaming-session-store.tstosrc/reference/streaming-session-store.ts. Host-neutralcreateSurfaceSessionStoreand its types now live insrc/server/surface-session-store.tsand delegate to the reference store at the call boundary. - 2.2 Move
BrowserSurfaceLeaseManagerlegacy fields containing_ref/run_id/interaction_idtosrc/reference/browser-surface-leases.ts. The whole 1208-LOC implementation moved into the reference subpath;src/leases/index.tsre-exports the host-neutral subset and re-exports the reference-shapedBrowserSurfaceLeaseManager+BrowserSurfaceLeasetypes with@deprecatedjsdoc. - 2.3 Move
reference-wire-fixtures.tsfromsrc/testing/tosrc/reference/;src/testing/index.tsretains a@deprecatedre-export so existing consumers keep compiling. - 2.4 Add
./referencetopackage.json#exports; exposetypes+importfor the moved surfaces. - 2.5 In
src/server/index.ts,src/leases/index.ts,src/testing/index.ts, andsrc/protocol/(index|stream-viewer).ts, re-export the moved symbols with/** @deprecated use @opendatalabs/remote-surface/reference */jsdoc using the placeholder horizon "removed in the first post-publish minor" (§7.4). - 2.6 Shrink the reference-token allowlist in
scripts/validate-package.mjsso_ref,run_id, andinteraction_idare only permitted underdist/reference/**, plus two explicitly documented host-neutral compatibility allowances: (a) the host-neutralSurfaceSessionStoreadapter implementationdist/server/surface-session-store.js{,.map}(translates camelCase requests to the reference store's snake_case API at the call boundary; declarations stay host-neutral), and (b) the@deprecatedjsdoc blocks in the migration-notice re-export index files (dist/(leases|protocol|server|testing)/(index|stream-viewer).(d.ts|js|js.map)) which mention the reference field names by name as part of the deprecation message. - 2.7 Run
pnpm --filter @opendatalabs/remote-surface verify; commit when green.
3. License Files (worker lane — placeholder copyright holder permitted while private: true; final holder line gated on §7.5 before public publish)
- 3.1 Add
packages/remote-surface/LICENSEwith the Apache-2.0 text. Until the owner confirms the final holder line in §7.5, use the placeholder"Copyright [year] OpenDataLabs contributors". Replace with the final holder line before flippingprivate: false. - 3.2 Flip
packages/remote-surface/package.json#licensefromISCtoApache-2.0. - 3.3 Add
LICENSEtopackage.json#filesand toallowedPackageFilePatternsinscripts/validate-package.mjs. - 3.4 Add
reference-implementation/LICENSE(Apache-2.0 mirror, same holder line as §3.1). - 3.5 Add repo-root
LICENSE-docscontaining the CC-BY-4.0 text; link it fromdocs/anddesign-notes/indexes so prose contributors see the license. (Note: link-from-indexes step is deferred to a docs lane; the file is present and referenced from the package README.) - 3.6 Confirm the packed tarball contains
LICENSE; re-runpnpm --filter @opendatalabs/remote-surface validate:package. (npm packoutput verified to containLICENSEandSECURITY.md; see §1.5 note for the clean-consumer caveat.)
4. Publish-Readiness Metadata (worker lane — owner inputs resolved in §7)
- 4.1 Fill in
packages/remote-surface/package.jsonwith the resolved owner values:"repository": { "type": "git", "url": "git+https://github.com/vana-com/remote-surface.git" },"bugs": { "url": "https://github.com/vana-com/remote-surface/issues" },"homepage": "https://github.com/vana-com/remote-surface#readme". - 4.2 Add
keywords(suggested seed:remote-surface,browser,neko,cdp,streaming,clipboard,mobile-ime,webrtc). - 4.3 Add
publishConfig.access: "public"; add a commentedpublishConfig.provenance: trueplaceholder. (Deferred to §5.1: the mergedstandardize-pdpp-package-publishingrelease policy indocs/package-release-policy.mdandscripts/check-package-release-policy.mjsforbidspublishConfigon any package withprivate: true. While this package remainsprivate: true(gated on §7.5), the manifest cannot carrypublishConfigwithout failingpnpm release:policy-check. The §5.1 lane that teaches the checker about@opendatalabs/remote-surfaceSHALL re-addpublishConfig.access: "public"at the same time it makes the package recognizable as publishable, so the manifest never carriespublishConfigwhile stillprivate: true. The earlier implementation landedpublishConfig.access: "public"prematurely and was removed by the adjacent package-policy lane.) - 4.4 Add
"engines": { "node": ">=24" }for the 2026 Active LTS line. - 4.5 Document the supported runtime contract (
Node >=24, ESM-only, browser API surface) in the README "Supported runtime assumptions" paragraph. - 4.6 Add
SECURITY.mdand a README "Reporting vulnerabilities" paragraph that route security reports tosecurity@vana.org.
5. Release-Policy Wiring (worker lane, gated on standardize-pdpp-package-publishing)
- 5.1 After
standardize-pdpp-package-publishinglands and the owner approves public publication for@opendatalabs/remote-surface, add it toscripts/check-package-release-policy.mjsso it is gated by the same0.0.0/ OIDC / provenance rules as the rest of the publishable packages. (2026-05-31 re-audit: the current policy is intentionally@pdpp/*-scoped and explicitly keeps@opendatalabs/remote-surfaceprivate; the checker already fails closed if this private package declarespublishConfigor flipsprivate:falsewithout being made publishable. Generalizing the checker is a release-management owner decision, not worker-safe tail work.) - 5.2 Add a CI step (or extend the existing one) that runs
pnpm --filter @opendatalabs/remote-surface verifyagainst every PR. (.github/workflows/remote-surface.ymlrunspnpm --filter @opendatalabs/remote-surface run verifyon pull requests and pushes touchingpackages/remote-surface/**,pnpm-lock.yaml, or the workflow. This matches the repo's path-scoped package CI convention used bypolyfill-connectors.ymlandreference-implementation.yml.)
6. Acceptance Checks (local automation)
- 6.1
openspec validate republish-remote-surface-as-opendatalabs --strictpasses. - 6.2
openspec validate --all --strictpasses (no collateral damage to sibling changes). - 6.3 After §1, repo grep for
@pdpp/remote-surfacereturns zero matches outside this change's artifacts and the archived prior changes. - 6.4 After §2,
dist/server/**,dist/protocol/**,dist/leases/**,dist/testing/**are scanned for_ref,run_id,interaction_id; the only residual matches are (a)dist/server/surface-session-store.js{,.map}translating camelCase to the reference store's snake_case API at the call boundary and (b)@deprecatedjsdoc blocks in the migration-notice re-export index files. Both are explicitly allowlisted inscripts/validate-package.mjswith a documented host-neutral compatibility rationale; everything else lives only underdist/reference/**. - 6.5 After §3,
npm packoutput for the package containsLICENSE. - 6.6 After §4,
package.jsonround-trips through validator withrepository,bugs,homepage,keywords, andengines.nodeset to concrete values. (publishConfig.accessis deferred along with §4.3 until §5.1 wires@opendatalabs/remote-surfaceinto the checker; whileprivate: true, the release policy forbidspublishConfig.)
7. Owner Decisions
Resolved (worker lanes apply verbatim)
- 7.1 Public repo URL →
https://github.com/vana-com/remote-surface. Manifest values are spelled out in §4.1. - 7.2 Security disclosure contact →
security@vana.org. §4.6 wiresSECURITY.mdand the README contact section. - 7.3 Supported Node major(s) →
engines.node: ">=24"(2026 Active LTS line for this new package; rationale in design.md). - 7.6
reference-implementation/LICENSEis Apache-2.0 (mirror of package code license; collapsed into §3.4). - 7.7 Community-Spec-1.0 is reserved (not declined) for future formal-spec artifacts; recorded in the spec deltas.
Deferred (release-management, MUST be answered before public npm publish; non-blocking for this change and for worker lanes §1–§6)
- 7.4 Reference-subpath deprecation horizon for the
./serverre-export of./referencesymbols. Workers ship the@deprecatedjsdoc immediately with a placeholder horizon ("removed in the first post-publish minor"); owner tightens the horizon during release prep. - 7.5 Final
LICENSEcopyright holder line forpackages/remote-surface/LICENSEandreference-implementation/LICENSE. While the package isprivate: true, workers MAY land Apache-2.0 boilerplate with a placeholder holder ("Copyright [year] OpenDataLabs contributors"). An explicit, owner-accepted holder line MUST be in place before theprivate: falseflip and the npm publish.
8. Publish Gate — exact owner checklist (no worker-safe action remains)
All §1–§6 worker-safe work is landed and green; the four unchecked boxes (4.3, 5.1, 7.4, 7.5) are interlocked owner/publish decisions, not independent residual code work. This section is the single ordered checklist the owner runs at release prep. Nothing here is a no-human task — each item either requires an owner decision or the
private: falseflip. Do not check any box below from a worker lane.Verified current state (2026-06-01, this worktree, post
pnpm install): name@opendatalabs/remote-surface;license: Apache-2.0;private: true; nopublishConfig;repository/bugs/homepage/keywords/engines.node:>=24set;./referencesubpath exported;LICENSE,SECURITY.md,reference-implementation/LICENSE,LICENSE-docspresent with theCopyright 2026 OpenDataLabs contributorsplaceholder holder;pnpm release:policy-checkpasses (package correctly excluded as private);verifypasses except the documented clean-consumerpnpm installstep, which fails only because pnpm'sminimumReleaseAgepolicy 404s the still-unpublished@opendatalabs/remote-surface@0.0.1— an environmental gate, not a rename defect.
- 8.1 (7.5) Owner decides the final copyright holder line. Replace
Copyright 2026 OpenDataLabs contributorsinpackages/remote-surface/LICENSEandreference-implementation/LICENSEwith the owner-accepted legal holder. Acceptance: both files carry the identical final line;git grep -n "OpenDataLabs contributors" packages/remote-surface/LICENSE reference-implementation/LICENSEreturns zero hits. - 8.2 (7.4) Owner sets the deprecation horizon. Replace the placeholder "removed in the first post-publish minor" in the
@deprecatedjsdoc ofsrc/(server|leases|testing|protocol)/index.ts(+protocol/stream-viewer.ts) with a concrete release. Acceptance: rebuild,pnpm --filter @opendatalabs/remote-surface check:diststays green, no placeholder horizon string remains indist/**. - 8.3 (5.1 + 4.3) Owner approves public publication, then wires the policy. After approval: add
@opendatalabs/remote-surfaceto the publishable allowlist inscripts/check-package-release-policy.mjsand, in the same commit, addpublishConfig.access: "public"to the manifest (the checker requires the two to move together so the manifest never carriespublishConfigwhile still excluded). Acceptance:pnpm release:policy-checkpasses with the package listed; manifest carriespublishConfig.access: "public". - 8.4 Flip
private: false(release prep, out of scope for this change). Only after 8.1–8.3. Acceptance:pnpm --filter @opendatalabs/remote-surface verifypasses end-to-end (the clean-consumerminimumReleaseAge404 resolves once the package exists on npm, or is waived per the publish runbook).
Acceptance checks
Reproducible verification:
cd <repo-root>
openspec validate republish-remote-surface-as-opendatalabs --strict
openspec validate --all --strict
# After §1 and §2 lanes execute (separate change-acceptance step):
rg -n "@pdpp/remote-surface" --glob '!openspec/changes/archive/**' # expect zero hits
rg -n "_ref|run_id|interaction_id" packages/remote-surface/dist --glob '!dist/reference/**' # expect zero hits
pnpm --filter @opendatalabs/remote-surface verify