Context
This is a scoping issue, not an implementation issue. Per project convention, no PR will be opened against any item here without K's explicit sign-off. Goal: gather enough specification that follow-up work can be scoped into atomic PRs.
What's already true (confirmed by code inspection, no action needed)
- All three editions (
apps/firefox-extension, apps/chrome-extension, apps/edge-extension) are on manifest version 0.0.3, and scripts/check.sh already hard-fails CI if the three manifest version fields diverge.
- CI already packages all three unsigned zips on every
dev push (scripts/package-extension.sh <edition>).
- Firefox already has a real signing/release pipeline (
release-main.yml, AMO via web-ext). Chrome/Edge have none.
- Shared-source layout (ADR-0008) already separates each edition's checked-in files (
manifest.json, README.md) from generated, gitignored files (src/, assets/, lib/, materialized by scripts/sync-extension-lib.sh). This is the existing domain-separation mechanism — see gaps below for what it doesn't cover.
- Edge's manifest is currently byte-identical to Chrome's (no Edge-specific fields yet).
Gaps / open questions to close before implementation
1. Domain-separation guard (hard requirement from K)
The gitignore+sync split prevents generated files from being committed, but nothing currently stops:
- Someone hand-editing
apps/chrome-extension/manifest.json with a field that silently diverges from what apps/firefox-extension/manifest.json expects (beyond the fields check.sh already validates: manifest_version, name, version, permissions, content_scripts, action, host_permissions).
- A generated file accidentally getting committed into an edition dir (bypassing
.gitignore via git add -f or similar).
Open question: should check.sh gain a stricter per-edition manifest-diff check (allowed-divergent-fields list, e.g. browser_specific_settings, minimum_chrome_version, vs. everything else must match), and should there be a pre-commit/CI check that fails if any edition dir has tracked files outside manifest.json/README.md?
2. No chrome-specific test directory; Firefox (source of truth) has the weakest shortcut coverage
scripts/test-chrome-smoke.mjs (single file, not a directory) already exercises the tmux-style prefix chords and jump-label overlay in real Chromium (presses Control+a, o, Escape, y).
scripts/test-extension-e2e.mjs (Firefox, web-ext + RDP) has zero coverage of the keyboard-shortcuts/jump-overlay feature.
- Since Firefox is the source of truth, this is inverted. Open question: add Firefox E2E coverage for prefix chords/jump-overlay, and/or formalize a
tests/e2e/<edition>/ layout instead of loose top-level scripts.
3. Chrome Web Store publish pipeline (net new)
- Requires: one-time $5 Google developer registration, a Google Cloud project with OAuth client (Web application type), a refresh token minted once (
chromewebstore scope), then hourly access tokens via plain oauth2.googleapis.com/token POST — no npm dependency needed, fits the existing zero-runtime-dep policy.
- New CWS API v2 (
chromewebstore.googleapis.com/v2/publishers/{id}/items/{id}:{action}) supports upload/publish/fetchStatus/cancelSubmission — but the first-ever listing must be created manually in the Developer Dashboard (Store listing + Privacy tabs); the API only updates an existing item.
- Privacy-practices tab (single-purpose description + per-permission justification) is mandatory.
- Manifest
"key" field (for a stable CI-build extension ID) must be stripped before the zip is uploaded to the Store — the Store assigns/owns the real key.
- Open question: who owns the Google Cloud project / billing identity for the OAuth client (K decision, not technical).
4. Edge Add-ons publish pipeline (net new)
- Partner Center API v1.1: simpler
ApiKey + X-ClientID header auth, no OAuth dance, replicable with stdlib HTTP.
- Same constraint: first submission must be done manually in Partner Center; API only updates an existing product.
- Review turnaround up to 7 business days.
- Can likely reuse the Chrome-built zip as-is today (manifest is currently identical), pending confirmation Edge doesn't need a divergent field once a real listing exists.
- Open question: pursue Edge now, or defer given it's a second manual bootstrap + secret set for a byte-identical package (K go/no-go).
5. Versioning once real publishing exists
- Parity is already enforced pre-publish. Not yet decided: on a needs-changes submission from either store, do we bump the shared version immediately or resubmit the same version? (Unconfirmed in either store's docs — needs a K decision, not a technical answer.)
6. Existing open questions this issue should resolve/close
From docs/ai/questions-for-K.md:
- Q1: AMO extension id is still
videodefaults@dev — must be finalized before first AMO upload (id is permanent once used).
- Q3: this issue is the explicit trigger for the "Chrome/Edge distribution targets" question — deferred pending store credentials, which is exactly what's being scoped here.
7. PRD milestone this continues
docs/PRD.md — Milestone 9 (AMO Release Readiness, VD-901..905) and Milestone 10 (VD-1004 Chromium build adapter — done; VD-1005 Edge packaging notes — manifest exists, no CI yet).
Non-goals for this issue
- No pull requests / code changes without K's explicit sign-off per item.
- No actual store developer account creation — blocked on K's identity/ownership decision (Google Cloud project, Microsoft Partner Center account).
Next step
K to answer: (a) who owns the Google/Microsoft developer identities, (b) go/no-go on Edge now vs later, (c) how strict the domain-separation CI guard should be (warn vs hard-fail), (d) same-version-resubmit policy for a needs-changes response.
Relates to #5 (icon placeholder — same Milestone 9 readiness area, filed separately since it's independently actionable).
Context
This is a scoping issue, not an implementation issue. Per project convention, no PR will be opened against any item here without K's explicit sign-off. Goal: gather enough specification that follow-up work can be scoped into atomic PRs.
What's already true (confirmed by code inspection, no action needed)
apps/firefox-extension,apps/chrome-extension,apps/edge-extension) are on manifest version0.0.3, andscripts/check.shalready hard-fails CI if the three manifestversionfields diverge.devpush (scripts/package-extension.sh <edition>).release-main.yml, AMO viaweb-ext). Chrome/Edge have none.manifest.json,README.md) from generated, gitignored files (src/,assets/,lib/, materialized byscripts/sync-extension-lib.sh). This is the existing domain-separation mechanism — see gaps below for what it doesn't cover.Gaps / open questions to close before implementation
1. Domain-separation guard (hard requirement from K)
The gitignore+sync split prevents generated files from being committed, but nothing currently stops:
apps/chrome-extension/manifest.jsonwith a field that silently diverges from whatapps/firefox-extension/manifest.jsonexpects (beyond the fieldscheck.shalready validates:manifest_version,name,version,permissions,content_scripts,action,host_permissions)..gitignoreviagit add -for similar).Open question: should
check.shgain a stricter per-edition manifest-diff check (allowed-divergent-fields list, e.g.browser_specific_settings,minimum_chrome_version, vs. everything else must match), and should there be a pre-commit/CI check that fails if any edition dir has tracked files outsidemanifest.json/README.md?2. No chrome-specific test directory; Firefox (source of truth) has the weakest shortcut coverage
scripts/test-chrome-smoke.mjs(single file, not a directory) already exercises the tmux-style prefix chords and jump-label overlay in real Chromium (pressesControl+a,o,Escape,y).scripts/test-extension-e2e.mjs(Firefox, web-ext + RDP) has zero coverage of the keyboard-shortcuts/jump-overlay feature.tests/e2e/<edition>/layout instead of loose top-level scripts.3. Chrome Web Store publish pipeline (net new)
chromewebstorescope), then hourly access tokens via plainoauth2.googleapis.com/tokenPOST — no npm dependency needed, fits the existing zero-runtime-dep policy.chromewebstore.googleapis.com/v2/publishers/{id}/items/{id}:{action}) supportsupload/publish/fetchStatus/cancelSubmission— but the first-ever listing must be created manually in the Developer Dashboard (Store listing + Privacy tabs); the API only updates an existing item."key"field (for a stable CI-build extension ID) must be stripped before the zip is uploaded to the Store — the Store assigns/owns the real key.4. Edge Add-ons publish pipeline (net new)
ApiKey+X-ClientIDheader auth, no OAuth dance, replicable with stdlib HTTP.5. Versioning once real publishing exists
6. Existing open questions this issue should resolve/close
From
docs/ai/questions-for-K.md:videodefaults@dev— must be finalized before first AMO upload (id is permanent once used).7. PRD milestone this continues
docs/PRD.md— Milestone 9 (AMO Release Readiness, VD-901..905) and Milestone 10 (VD-1004 Chromium build adapter — done; VD-1005 Edge packaging notes — manifest exists, no CI yet).Non-goals for this issue
Next step
K to answer: (a) who owns the Google/Microsoft developer identities, (b) go/no-go on Edge now vs later, (c) how strict the domain-separation CI guard should be (warn vs hard-fail), (d) same-version-resubmit policy for a needs-changes response.
Relates to #5 (icon placeholder — same Milestone 9 readiness area, filed separately since it's independently actionable).