Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
e81cdbd
test(mv3): require content-script isolated-world proof
seonghobae Aug 10, 2026
b2d2324
feat(mv3): publish main-world isolation sentinel
seonghobae Aug 10, 2026
26762be
feat(mv3): gate content readiness on isolated world
seonghobae Aug 10, 2026
c1705ad
docs(changelog): record isolated-world compatibility
seonghobae Aug 10, 2026
3c2f506
merge: align MV3 isolated-world evidence with current prerequisite
seonghobae Aug 15, 2026
d9bfadb
merge: align MV3 isolated-world evidence with current update prerequi…
seonghobae Aug 16, 2026
e3ef1b9
fix: preserve current MV3 download prerequisite semantics
seonghobae Aug 16, 2026
a7e3b0b
merge: realign isolated-world compatibility with cleanup-safe update …
seonghobae Aug 16, 2026
13a4e35
test(mv3): inherit update-lane cleanup normalization
seonghobae Aug 16, 2026
e0390d6
chore(mv3): align isolated world with live update prerequisite
seonghobae Aug 16, 2026
c259277
merge(mv3): align isolated-world proof with repaired update migration
seonghobae Aug 16, 2026
e149dcd
fix(mv3): rebuild isolated-world tree from current update prerequisite
seonghobae Aug 16, 2026
b211632
fix(mv3): compose isolated-world proof with current fixture evidence
seonghobae Aug 16, 2026
6afe270
fix(mv3): compose isolated-world changelog with prerequisite truth
seonghobae Aug 16, 2026
12bcbd7
chore(mv3): realign isolated-world evidence with update migration
seonghobae Aug 17, 2026
c126def
chore(mv3): realign isolated-world lane with current update migration
seonghobae Aug 17, 2026
aba6668
docs(doctoring): preserve prerequisite bookmark evidence
seonghobae Aug 17, 2026
a8cb64e
merge(stack): align isolated-world child to current update parent
seonghobae Aug 17, 2026
8738912
Merge a8cb64e29a69151992d597a22a8e9a376f7e66c0 into 2c1ec3a92efb2aa94…
seonghobae Aug 19, 2026
596f0c8
chore(mv3): realign isolated world with live update migration
seonghobae Aug 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ All notable changes to OriginWeave are documented in this file. The format follo
- Proposed product-wide target-architecture ADRs for the Rust control plane, isolated execution modes, typed actions, semantic observation/stale-node authority, prompt-injection and secret separation, resource-governor priority, provenance evidence, browser/protocol adapters, crawler policy, and hourly automation operational closure; these remain Proposed rather than shipped claims until protected review and merge.
- Pinned real-Chromium Manifest V3 compatibility evidence for a controlled history add/read/delete lifecycle confined to the ephemeral loopback fixture profile, with cleanup verification and no OriginWeave Agent history-authority claim.
- Pinned real-Chromium Manifest V3 update-migration evidence using a trial-local unpacked-extension copy, a controlled `1.0.0` to `1.0.1` transition, persisted profile state, and explicit schema migration without modifying the checked-in fixture or granting Agent authority.
- Pinned real-Chromium Manifest V3 content-script isolated-world evidence that requires the page main world and extension isolated world to retain distinct JavaScript globals while sharing only a controlled DOM sentinel.

### Changed

Expand Down
8 changes: 7 additions & 1 deletion tests/fixtures/mv3_basic/content_script.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
"use strict";

(async () => {
document.documentElement.dataset.originweaveContentScript = "ready";
window.originweaveWorldSentinel = "extension";
await new Promise((resolve) => setTimeout(resolve, 75));
const pageWorldSentinel = document.documentElement.dataset.originweavePageWorld;
document.documentElement.dataset.originweaveContentScript =
window.originweaveWorldSentinel === "extension" && pageWorldSentinel === "page"
? "ready"
: "missing";

const previous = await chrome.storage.local.get("originweave_content");
const storagePersisted = previous.originweave_content === "ready";
Expand Down
8 changes: 8 additions & 0 deletions tests/fixtures/mv3_basic/page.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ <h1>OriginWeave MV3 compatibility fixture</h1>
</main>
<script>
"use strict";
window.originweaveWorldSentinel = "page";
const publishPageWorld = () => {
document.documentElement.dataset.originweavePageWorld =
window.originweaveWorldSentinel;
};
publishPageWorld();
setInterval(publishPageWorld, 25);

document.querySelector("#fixture-button").addEventListener("click", () => {
document.querySelector("#fixture-output").textContent = "clicked";
});
Expand Down
44 changes: 44 additions & 0 deletions tests/test_mv3_isolated_world_contract.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""Fail-first contract for real Manifest V3 content-script isolated-world evidence."""

from __future__ import annotations

import pathlib
import unittest

ROOT = pathlib.Path(__file__).resolve().parents[1]
FIXTURE = ROOT / "tests" / "fixtures" / "mv3_basic"


class ManifestV3IsolatedWorldContractTests(unittest.TestCase):
"""Require content-script compatibility to prove main/isolated world separation."""

def test_page_continuously_exposes_its_main_world_sentinel(self) -> None:
"""The page must re-read its own window after the content script runs."""

page = (FIXTURE / "page.html").read_text(encoding="utf-8")
for expected in (
'window.originweaveWorldSentinel = "page"',
"originweavePageWorld",
"setInterval",
):
with self.subTest(expected=expected):
self.assertIn(expected, page)

def test_content_ready_depends_on_isolated_world_separation(self) -> None:
"""The existing content-script gate must fail if page and extension worlds collapse."""

content = (FIXTURE / "content_script.js").read_text(encoding="utf-8")
for expected in (
'window.originweaveWorldSentinel = "extension"',
"originweavePageWorld",
'window.originweaveWorldSentinel === "extension"',
'pageWorldSentinel === "page"',
):
with self.subTest(expected=expected):
self.assertIn(expected, content)
self.assertIn("setTimeout", content)
self.assertIn("originweaveContentScript", content)


if __name__ == "__main__":
unittest.main()
Loading