Implement bounded browser service, consumer evidence and managed package
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a13590-a16f-7f60-be60-fd71627bc99d
13
docs/evidence/2026-10-13-browser-integration.log
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
docker run --rm --init --user 1000:1000 --read-only --tmpfs /tmp:rw,size=512m --shm-size=256m --memory=1g --cpus=1 --cap-drop ALL --security-opt no-new-privileges --mount type=bind,src=/home/worsch/rapp-playwright,dst=/app,readonly -w /app mcr.microsoft.com/playwright:v1.64.0-noble@sha256:06a9939e57531807f8d5fd76ce44b53165ffb7d7501d87ab10e285c20b1e971f node --test tests/integration.mjs
|
||||
✔ real browser produces responsive keyboard evidence, fresh state and scoped artifacts (34881.527994ms)
|
||||
✔ UI failures, unreachable targets and forbidden redirects remain distinguishable (33199.838535ms)
|
||||
✔ queue limits, cancellation, timeout, worker crash and subsequent recovery (24287.921891ms)
|
||||
✔ restart marks abandoned runs interrupted and expiry removes artifacts (6352.642442ms)
|
||||
ℹ tests 4
|
||||
ℹ suites 0
|
||||
ℹ pass 4
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 99315.842719
|
||||
86
docs/evidence/2026-10-13-build.log
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
npm run check
|
||||
|
||||
> rapp-playwright@0.1.0 check
|
||||
> node --check src/server.mjs && node --check src/worker.mjs && node --check src/proxy.mjs
|
||||
|
||||
python3 -m py_compile client/rapp_playwright.py tools/render.py
|
||||
npm test
|
||||
|
||||
> rapp-playwright@0.1.0 test
|
||||
> node --test tests/*.test.mjs
|
||||
|
||||
✔ validated contract requires explicit protocol, allowed origin, bounded input and assertions (3.01824ms)
|
||||
✔ network gate denies non-public addresses unless explicitly granted (6.721745ms)
|
||||
✔ proxy pins DNS and denies unlisted origins and private addresses before connection (49.97023ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 196.640985
|
||||
docker build -t forgejo.coulomb.social/coulomb/rapp-playwright:0.1.0 .
|
||||
#0 building with "default" instance using docker driver
|
||||
|
||||
#1 [internal] load build definition from Dockerfile
|
||||
#1 transferring dockerfile: 773B done
|
||||
#1 DONE 0.0s
|
||||
|
||||
#2 [internal] load metadata for mcr.microsoft.com/playwright:v1.64.0-noble@sha256:06a9939e57531807f8d5fd76ce44b53165ffb7d7501d87ab10e285c20b1e971f
|
||||
#2 DONE 0.1s
|
||||
|
||||
#3 [internal] load .dockerignore
|
||||
#3 transferring context: 109B done
|
||||
#3 DONE 0.0s
|
||||
|
||||
#4 [internal] load build context
|
||||
#4 DONE 0.0s
|
||||
|
||||
#5 [ 1/10] FROM mcr.microsoft.com/playwright:v1.64.0-noble@sha256:06a9939e57531807f8d5fd76ce44b53165ffb7d7501d87ab10e285c20b1e971f
|
||||
#5 resolve mcr.microsoft.com/playwright:v1.64.0-noble@sha256:06a9939e57531807f8d5fd76ce44b53165ffb7d7501d87ab10e285c20b1e971f 0.1s done
|
||||
#5 DONE 0.1s
|
||||
|
||||
#4 [internal] load build context
|
||||
#4 transferring context: 18.23kB 0.0s done
|
||||
#4 DONE 0.0s
|
||||
|
||||
#6 [ 3/10] RUN apt-get update && apt-get install -y --no-install-recommends tini=0.19.0-1 && rm -rf /var/lib/apt/lists/*
|
||||
#6 CACHED
|
||||
|
||||
#7 [ 4/10] COPY package.json package-lock.json ./
|
||||
#7 CACHED
|
||||
|
||||
#8 [ 2/10] WORKDIR /app
|
||||
#8 CACHED
|
||||
|
||||
#9 [ 5/10] RUN npm ci --omit=dev --ignore-scripts && npm cache clean --force
|
||||
#9 CACHED
|
||||
|
||||
#10 [ 6/10] COPY src ./src
|
||||
#10 DONE 0.1s
|
||||
|
||||
#11 [ 7/10] COPY fixtures ./fixtures
|
||||
#11 DONE 0.1s
|
||||
|
||||
#12 [ 8/10] COPY client ./client
|
||||
#12 DONE 0.1s
|
||||
|
||||
#13 [ 9/10] COPY --chmod=0555 tools/chromium-launcher.py ./tools/chromium-launcher.py
|
||||
#13 DONE 0.1s
|
||||
|
||||
#14 [10/10] RUN mkdir /data && chown pwuser:pwuser /data
|
||||
#14 DONE 0.5s
|
||||
|
||||
#15 exporting to image
|
||||
#15 exporting layers
|
||||
#15 exporting layers 0.5s done
|
||||
#15 exporting manifest sha256:20d8310d44cd807579aca06df01090a7bb27892ce387519f9957e4dd67f64cc7 0.0s done
|
||||
#15 exporting config sha256:5bda1139fda091648b1e984f6be8119291ad5616263b206d62ac7986ba2762b3 0.0s done
|
||||
#15 exporting attestation manifest sha256:3267896f3b778dedce0b2c92ea1c67b64a6e168417aa422c4750dcbcb0d165f5 0.1s done
|
||||
#15 exporting manifest list sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441
|
||||
#15 exporting manifest list sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441 0.0s done
|
||||
#15 naming to forgejo.coulomb.social/coulomb/rapp-playwright:0.1.0 done
|
||||
#15 unpacking to forgejo.coulomb.social/coulomb/rapp-playwright:0.1.0
|
||||
#15 unpacking to forgejo.coulomb.social/coulomb/rapp-playwright:0.1.0 0.2s done
|
||||
#15 DONE 1.0s
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"id": "621635c9-0a72-4a88-9fd6-2ee1fbddc68f",
|
||||
"from_agent": "rapp-playwright",
|
||||
"to_agent": "content-explorer",
|
||||
"subject": "Pinned OnCo responsive and keyboard pilot evidence available",
|
||||
"body": "WP-0004-T02 provider pilot passed on pinned OnCo SHA b594d7433bf4e408b44215e25e5304696d6f840e. Original upstream-onco checkout untouched; temporary copy served with Next dev on port3300. examples/content-explorer-onco.json asserted home heading, captured 1280x800 / 390x844, Tab focus on a.skip-link, Enter and #main URL. Run 1e89ce26-fc3c-4eb3-8280-b36800b92efc passed all16steps and6PNGs. Sanitized receipts and selected PNGs: /home/worsch/rapp-playwright/docs/evidence/2026-10-13-content-explorer-pilot/. Full local outputs .local/content-explorer-onco-01 (private run handle must not be published). Please review for CONTENT-WP-0000-T04; you own acceptance and any further route/keyboard coverage. This is workstation-container evidence, not managed Railiance or current live onco.cc. Provider will retain exact launch command and limits in docs/content-explorer-pilot.md.",
|
||||
"thread_id": null,
|
||||
"read_at": null,
|
||||
"archived_at": null,
|
||||
"created_at": "2026-10-13T17:12:27.179074Z",
|
||||
"kind": "message",
|
||||
"expires_at": null,
|
||||
"supersedes_id": null,
|
||||
"reader": null,
|
||||
"delivered_at": null,
|
||||
"acknowledged_at": null
|
||||
}
|
||||
|
After Width: | Height: | Size: 335 KiB |
|
After Width: | Height: | Size: 307 KiB |
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"argv": [
|
||||
"client/rapp_playwright.py",
|
||||
"run",
|
||||
"--spec",
|
||||
"examples/content-explorer-onco.json",
|
||||
"--out",
|
||||
".local/content-explorer-onco-01"
|
||||
],
|
||||
"service_url": "http://127.0.0.1:18081"
|
||||
}
|
||||
|
After Width: | Height: | Size: 138 KiB |
BIN
docs/evidence/2026-10-13-content-explorer-pilot/narrow-final.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"available": true,
|
||||
"error": null,
|
||||
"checked_at": "2026-10-13T16:43:51.651Z",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"api_version": "1",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"execution_location": "workstation-container",
|
||||
"release": "development",
|
||||
"allowed_origins": [
|
||||
"http://host.docker.internal:3300",
|
||||
"https://onco.cc"
|
||||
],
|
||||
"fixture": true,
|
||||
"active": 0,
|
||||
"queued": 0,
|
||||
"limits": {
|
||||
"concurrency": 1,
|
||||
"max_queue": 4,
|
||||
"max_timeout_ms": 120000,
|
||||
"retention_ms": 3600000,
|
||||
"max_runs": 64
|
||||
}
|
||||
}
|
||||
214
docs/evidence/2026-10-13-content-explorer-pilot/receipt.json
Normal file
|
|
@ -0,0 +1,214 @@
|
|||
{
|
||||
"id": "1e89ce26-fc3c-4eb3-8280-b36800b92efc",
|
||||
"api_version": "1",
|
||||
"status": "passed",
|
||||
"error": null,
|
||||
"label": "content-explorer-pinned-onco-home",
|
||||
"target": "http://host.docker.internal:3300/",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
},
|
||||
{
|
||||
"name": "narrow",
|
||||
"width": 390,
|
||||
"height": 844
|
||||
}
|
||||
],
|
||||
"timeout_ms": 120000,
|
||||
"created_at": "2026-10-13T16:43:53.447Z",
|
||||
"expires_at": "2026-10-13T17:43:53.447Z",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"release": "development",
|
||||
"execution_location": "workstation-container",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"completed_steps": 16,
|
||||
"steps": [
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 0,
|
||||
"action": "visible",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:10.155Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:14.051Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 2,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:14.353Z"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 3,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:17.012Z",
|
||||
"key": "Tab"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 4,
|
||||
"action": "focused",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:17.073Z",
|
||||
"selector": "a.skip-link"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 5,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:17.255Z",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 6,
|
||||
"action": "url",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:17.296Z"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 7,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:17.296Z"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 0,
|
||||
"action": "visible",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:30.719Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:31.430Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 2,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:31.588Z"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 3,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:34.905Z",
|
||||
"key": "Tab"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 4,
|
||||
"action": "focused",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:34.968Z",
|
||||
"selector": "a.skip-link"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 5,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:35.026Z",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 6,
|
||||
"action": "url",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:35.085Z"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 7,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:35.085Z"
|
||||
}
|
||||
],
|
||||
"artifacts": [
|
||||
{
|
||||
"name": "desktop-2-baseline.png",
|
||||
"bytes": 342951
|
||||
},
|
||||
{
|
||||
"name": "desktop-7-keyboard-skip.png",
|
||||
"bytes": 314186
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"bytes": 314186
|
||||
},
|
||||
{
|
||||
"name": "narrow-2-baseline.png",
|
||||
"bytes": 140972
|
||||
},
|
||||
{
|
||||
"name": "narrow-7-keyboard-skip.png",
|
||||
"bytes": 129764
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"bytes": 129764
|
||||
}
|
||||
],
|
||||
"started_at": "2026-10-13T16:43:53.457Z",
|
||||
"blocked_requests": 0,
|
||||
"finished_at": "2026-10-13T16:44:36.275Z",
|
||||
"downloads": [
|
||||
{
|
||||
"name": "desktop-2-baseline.png",
|
||||
"bytes": 342951,
|
||||
"sha256": "c36fb610e09bf04ba76e9755103ab2c36d39bfcfc286be8590c517c9fa7705b8"
|
||||
},
|
||||
{
|
||||
"name": "desktop-7-keyboard-skip.png",
|
||||
"bytes": 314186,
|
||||
"sha256": "a64096394d8750ef422b1f5b6b0f939607cb13a57703f5b2d39c2be84bf2e3c7"
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"bytes": 314186,
|
||||
"sha256": "a64096394d8750ef422b1f5b6b0f939607cb13a57703f5b2d39c2be84bf2e3c7"
|
||||
},
|
||||
{
|
||||
"name": "narrow-2-baseline.png",
|
||||
"bytes": 140972,
|
||||
"sha256": "7c3a5278d3dcd35413658fbfceb6d19e176439f2ffc2e628f7bbfea6ee6b641f"
|
||||
},
|
||||
{
|
||||
"name": "narrow-7-keyboard-skip.png",
|
||||
"bytes": 129764,
|
||||
"sha256": "865fe283ca6a38742ff176c67f4eeee68f37ac92d8d60a6e67fb8b00778ba58e"
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"bytes": 129764,
|
||||
"sha256": "865fe283ca6a38742ff176c67f4eeee68f37ac92d8d60a6e67fb8b00778ba58e"
|
||||
}
|
||||
]
|
||||
}
|
||||
18
docs/evidence/2026-10-13-contract-decision.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"workplan_id": "98fb515e-9239-57d5-9ffa-8a5c5a86ed90",
|
||||
"id": "90c6d03a-6308-4741-ab71-ac837e242e85",
|
||||
"topic_id": "595afc64-bd28-47bf-aafb-ba230b28371b",
|
||||
"title": "Use bounded browser jobs and assign platform lifecycle ownership",
|
||||
"description": "Implement protocol-v1 HTTP jobs with Python stdlib client, pinned Playwright 1.64.0 / Chromium image, per-run process/context, private RBAC port-forward and scoped run capabilities. Founder explicitly selected railiance-platform as lifecycle owner on 2026-10-13; service implementation remains in rapp-playwright. Managed activation still requires platform admission.",
|
||||
"decision_type": "made",
|
||||
"status": "resolved",
|
||||
"rationale": "Independent client avoids matching local browser installs; bounded jobs constrain network and resource use. See docs/consumer-contract.md. Ownership follows the founder response, not inferred owner approval.",
|
||||
"decided_by": "codex (implementation contract); founder (lifecycle owner selection)",
|
||||
"decided_at": null,
|
||||
"deadline": null,
|
||||
"escalation_note": null,
|
||||
"superseded_by": null,
|
||||
"created_at": "2026-10-13T17:15:54.752167Z",
|
||||
"updated_at": "2026-10-13T17:15:54.752167Z",
|
||||
"workstream_id": "98fb515e-9239-57d5-9ffa-8a5c5a86ed90"
|
||||
}
|
||||
39
docs/evidence/2026-10-13-discovery-readback.json
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
{
|
||||
"url": "https://reuse.coulomb.social/v1/federated",
|
||||
"matches": [
|
||||
{
|
||||
"id": "capability.infotech.headless-browser",
|
||||
"name": "Headless Browser Automation",
|
||||
"summary": "Headless browser automation with Playwright and Chromium for UI testing, screenshots and page extraction; recommended default based on existing whynot-design, coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided service will be available shortly (announced 2026-10-13; planned, not yet verified available).",
|
||||
"vector": "D3 / A2 / C2 / R2",
|
||||
"domain": "infotech",
|
||||
"status": "reviewed",
|
||||
"owner": "reuse-surface",
|
||||
"path": "registry/capabilities/capability.infotech.headless-browser.md",
|
||||
"tags": [
|
||||
"headless",
|
||||
"browser",
|
||||
"automation",
|
||||
"playwright",
|
||||
"chromium",
|
||||
"testing",
|
||||
"screenshots",
|
||||
"extraction",
|
||||
"firefox",
|
||||
"webkit",
|
||||
"selenium",
|
||||
"puppeteer"
|
||||
],
|
||||
"consumption_modes": [
|
||||
"informational",
|
||||
"source adaptation",
|
||||
"JavaScript library",
|
||||
"Python library"
|
||||
],
|
||||
"source_repo": "reuse-surface",
|
||||
"source_url": "https://forgejo.coulomb.social/coulomb/reuse-surface/raw/branch/main/registry/indexes/capabilities.yaml",
|
||||
"source_index": "/data/cache/reuse-surface.yaml"
|
||||
}
|
||||
],
|
||||
"composed_at": "2026-10-13T14:03:25+00:00"
|
||||
}
|
||||
49
docs/evidence/2026-10-13-final-image-restart.json
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
{
|
||||
"action": "docker restart rapp-playwright-final",
|
||||
"preflight": {
|
||||
"available": true,
|
||||
"error": null,
|
||||
"checked_at": "2026-10-13T17:17:36.100Z",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"api_version": "1",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"execution_location": "workstation-release-check",
|
||||
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
|
||||
"allowed_origins": [],
|
||||
"fixture": true,
|
||||
"active": 0,
|
||||
"queued": 0,
|
||||
"limits": {
|
||||
"concurrency": 1,
|
||||
"max_queue": 4,
|
||||
"max_timeout_ms": 120000,
|
||||
"retention_ms": 3600000,
|
||||
"max_runs": 64
|
||||
}
|
||||
},
|
||||
"retrieved_run_id": "35124424-950a-4339-adea-45525b470cab",
|
||||
"status": "passed",
|
||||
"artifacts": [
|
||||
{
|
||||
"name": "desktop-6-keyboard-result.png",
|
||||
"bytes": 26622,
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"bytes": 26622,
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
|
||||
},
|
||||
{
|
||||
"name": "narrow-6-keyboard-result.png",
|
||||
"bytes": 24280,
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"bytes": 24280,
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
|
||||
}
|
||||
]
|
||||
}
|
||||
40
docs/evidence/2026-10-13-implementation-checks.json
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
{
|
||||
"observed_at": "2026-10-13T17:20:07.614706+00:00",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"local_image": "forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
|
||||
"registry_publication": "blocked: blob PUT HTTP 499 and 500; remote manifest inspect returns manifest unknown",
|
||||
"unit_tests": {
|
||||
"passed": 3,
|
||||
"command": "make test"
|
||||
},
|
||||
"browser_integration": {
|
||||
"passed": 4,
|
||||
"command": "make test-integration",
|
||||
"log": "2026-10-13-browser-integration.log"
|
||||
},
|
||||
"additional_browser_test": {
|
||||
"passed": 1,
|
||||
"name": "missing browser fails preflight and prevents admission",
|
||||
"log": "2026-10-13-missing-browser.log"
|
||||
},
|
||||
"family_declaration_validation": "2 declaration(s) ok with rail-kubernetes dependency",
|
||||
"render": "passed with exact candidate digest; floating references rejected",
|
||||
"kubernetes_client_dry_run": "7 objects validated; no objects persisted",
|
||||
"kubernetes_server_dry_run": "not run: namespace absent and admission pending",
|
||||
"cluster_mutations": "none",
|
||||
"capacity": {
|
||||
"node_ip": "92.205.62.239",
|
||||
"node_ready": true,
|
||||
"cpu_request_m": 3460,
|
||||
"cpu_allocatable_m": 4000,
|
||||
"memory_requests_mi": 9472
|
||||
},
|
||||
"final_container": "rapp-playwright-final",
|
||||
"local_url": "http://127.0.0.1:18083",
|
||||
"independent_final_run": "35124424-950a-4339-adea-45525b470cab",
|
||||
"restart": "completed receipt plus four hashed PNGs retrieved after docker restart",
|
||||
"platform_request": "e77247e5-ce25-4711-a64f-af81a9f7cbb1",
|
||||
"managed_status": "not deployed; namespace playwright absent"
|
||||
}
|
||||
67
docs/evidence/2026-10-13-implementation.md
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# Implementation verification — 2026-10-13
|
||||
|
||||
The bounded service, Python client and managed package are implemented. Local
|
||||
runtime and independent consumption passed. Image publication and managed
|
||||
activation are blocked by external delivery dependencies; neither is claimed.
|
||||
|
||||
[Machine-readable checks](2026-10-13-implementation-checks.json) record the
|
||||
candidate image identity, commands, resource observations and handoff IDs.
|
||||
|
||||
- `make test`: syntax/compile checks and 3 unit tests passed.
|
||||
- `make test-integration`: 4 real-browser cases passed in 99 seconds under
|
||||
non-root, read-only Docker, dropped capabilities, no-new-privileges, 1 CPU,
|
||||
1Gi memory and bounded tmpfs. [Log](2026-10-13-browser-integration.log).
|
||||
- The added missing-browser case separately passed: HTTP 503 launch preflight
|
||||
and rejected run admission. [Log](2026-10-13-missing-browser.log).
|
||||
- [Build log](2026-10-13-build.log): final pinned runtime image built successfully.
|
||||
- [Independent trials](2026-10-13-independent-local-consumer.md): initial and
|
||||
final-image consumer trials, keyboard/screenshots and failure cases passed.
|
||||
- [Final-image restart](2026-10-13-final-image-restart.json): availability recovered
|
||||
and completed run/artifacts remained retrievable from its retained volume.
|
||||
- [Pinned OnCo pilot](../content-explorer-pilot.md): home-page responsive and
|
||||
skip-link evidence passed; content-explorer retains its own acceptance.
|
||||
|
||||
The integration suite checks fresh cookie/localStorage state, foreign-token
|
||||
receipt/artifact denial, protocol mismatch, assertion failure, unavailable target,
|
||||
blocked redirect without request leakage, concurrent admission bounds, queued
|
||||
and active cancellation, hard timeout, forced worker crash with no remaining
|
||||
browser process group, subsequent recovery, interrupted persisted work and
|
||||
expiry deletion. Temporary browser profiles and home directories are scoped to
|
||||
the supervised worker and removed after its exit. This is not proof of safety
|
||||
for hostile pages or mutually untrusted tenants; Chromium's OS sandbox is off.
|
||||
|
||||
Package schema validation passed against railiance-master with rail-kubernetes
|
||||
references. Digest rendering and Kubernetes client validation passed for all
|
||||
seven objects. No server-side admission success is claimed. The namespace does
|
||||
not exist and no cluster object was created in this session. At the recorded
|
||||
capacity check, railiance01 was Ready with 3460m CPU requested out of 4000m;
|
||||
the package requests 100m and uses Recreate. Recheck before deployment.
|
||||
|
||||
## Publication and owner dependencies
|
||||
|
||||
Three OCI upload attempts encountered final blob PUT failures (HTTP 499, then
|
||||
HTTP 500); smaller layers uploaded. Remote manifest inspection returned
|
||||
`manifest unknown`. Local image index:
|
||||
`sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441`.
|
||||
This digest identifies a built image, not an available registry release.
|
||||
|
||||
The founder selected railiance-platform lifecycle ownership. Admission request
|
||||
`c82d75f3-3191-410d-a8c8-fd647bf7f3ef` and the final
|
||||
[platform handoff](2026-10-13-platform-implementation-notification.json) await
|
||||
an owner response. Cluster access binding, live restart and rollback remain
|
||||
WP-0004-T01 work. There is no previous managed release for cross-version rollback.
|
||||
|
||||
The [reuse-surface handoff](2026-10-13-reuse-surface-implementation-notification.json)
|
||||
asks the owner to publish verified local provider references without claiming
|
||||
managed availability. Readback at 19:18 Europe/Berlin still showed the source-only
|
||||
D3/A2/C2/R2 entry and planned provider; no maintained update was inferred from
|
||||
message delivery. The [published discovery readback](2026-10-13-discovery-readback.json)
|
||||
also returned the planned provider and D3/A2/C2/R2 from the live federated API.
|
||||
WP-0004-T03 remains open. The
|
||||
[content-explorer handoff](2026-10-13-content-explorer-implementation-notification.json)
|
||||
delivers the home-page evidence without closing CONTENT-WP-0000-T04.
|
||||
|
||||
The development provider, failed intermediate check container and temporary
|
||||
OnCo server were stopped. The final local provider remains on loopback port
|
||||
18083 for inspection; it is a workstation process, not a managed endpoint.
|
||||
Server artifacts expire after one hour; the linked safe evidence is retained.
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
[
|
||||
{
|
||||
"name": "desktop-6-keyboard-result.png",
|
||||
"dimensions": [
|
||||
1280,
|
||||
800
|
||||
],
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"dimensions": [
|
||||
1280,
|
||||
800
|
||||
],
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "narrow-6-keyboard-result.png",
|
||||
"dimensions": [
|
||||
390,
|
||||
844
|
||||
],
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
|
||||
"bytes": 24280
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"dimensions": [
|
||||
390,
|
||||
844
|
||||
],
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
|
||||
"bytes": 24280
|
||||
}
|
||||
]
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
{
|
||||
"trial_exit": 0,
|
||||
"intentional_ui_failure_exit": 2,
|
||||
"failed_ui_status_command_exit": 0,
|
||||
"unavailable_service_preflight": {
|
||||
"argv": [
|
||||
"python3",
|
||||
"client/rapp_playwright.py",
|
||||
"--url",
|
||||
"http://127.0.0.1:18089",
|
||||
"preflight"
|
||||
],
|
||||
"exit": 3,
|
||||
"response": {
|
||||
"error": "service_unreachable: establish the documented tunnel and retry"
|
||||
}
|
||||
},
|
||||
"trial_directory_mode": "0700",
|
||||
"trial_handle_mode": "0600",
|
||||
"external_target_tested": false,
|
||||
"status_without_url_override": {
|
||||
"exit": 3,
|
||||
"response": {
|
||||
"error": "HTTP 404: not_found"
|
||||
},
|
||||
"service_url": "http://127.0.0.1:18081"
|
||||
},
|
||||
"failed_ui_status_command_url": "http://127.0.0.1:18083"
|
||||
}
|
||||
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"api_version": "1",
|
||||
"target": "fixture",
|
||||
"label": "independent-final-ui-failure",
|
||||
"timeout_ms": 30000,
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
{
|
||||
"action": "screenshot",
|
||||
"name": "before-failure"
|
||||
},
|
||||
{
|
||||
"action": "text",
|
||||
"selector": "#count",
|
||||
"value": "99999"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"argv": [
|
||||
"client/rapp_playwright.py",
|
||||
"--url",
|
||||
"http://127.0.0.1:18083",
|
||||
"trial",
|
||||
"--out",
|
||||
".local/independent-final-01"
|
||||
],
|
||||
"service_url": "http://127.0.0.1:18083"
|
||||
}
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"available": true,
|
||||
"error": null,
|
||||
"checked_at": "2026-10-13T17:14:29.108Z",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"api_version": "1",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"execution_location": "workstation-release-check",
|
||||
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
|
||||
"allowed_origins": [],
|
||||
"fixture": true,
|
||||
"active": 0,
|
||||
"queued": 0,
|
||||
"limits": {
|
||||
"concurrency": 1,
|
||||
"max_queue": 4,
|
||||
"max_timeout_ms": 120000,
|
||||
"retention_ms": 3600000,
|
||||
"max_runs": 64
|
||||
}
|
||||
}
|
||||
184
docs/evidence/2026-10-13-independent-final-consumer/receipt.json
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
{
|
||||
"id": "35124424-950a-4339-adea-45525b470cab",
|
||||
"api_version": "1",
|
||||
"status": "passed",
|
||||
"error": null,
|
||||
"label": "independent-browser-trial",
|
||||
"target": "fixture",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
},
|
||||
{
|
||||
"name": "narrow",
|
||||
"width": 390,
|
||||
"height": 844
|
||||
}
|
||||
],
|
||||
"timeout_ms": 60000,
|
||||
"created_at": "2026-10-13T17:14:50.050Z",
|
||||
"expires_at": "2026-10-13T18:14:50.050Z",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
|
||||
"execution_location": "workstation-release-check",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"completed_steps": 14,
|
||||
"steps": [
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 0,
|
||||
"action": "visible",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:14:56.554Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:14:57.033Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 2,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:14:57.233Z",
|
||||
"key": "Tab"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 3,
|
||||
"action": "focused",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:14:57.247Z",
|
||||
"selector": "#increment"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 4,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:14:57.341Z",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 5,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:14:57.354Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 6,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:14:57.441Z"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 0,
|
||||
"action": "visible",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:00.135Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:00.349Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 2,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:00.547Z",
|
||||
"key": "Tab"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 3,
|
||||
"action": "focused",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:00.633Z",
|
||||
"selector": "#increment"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 4,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:00.644Z",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 5,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:00.654Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 6,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:00.734Z"
|
||||
}
|
||||
],
|
||||
"artifacts": [
|
||||
{
|
||||
"name": "desktop-6-keyboard-result.png",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "narrow-6-keyboard-result.png",
|
||||
"bytes": 24280
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"bytes": 24280
|
||||
}
|
||||
],
|
||||
"started_at": "2026-10-13T17:14:50.055Z",
|
||||
"blocked_requests": 13,
|
||||
"finished_at": "2026-10-13T17:15:01.861Z",
|
||||
"downloads": [
|
||||
{
|
||||
"name": "desktop-6-keyboard-result.png",
|
||||
"bytes": 26622,
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"bytes": 26622,
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
|
||||
},
|
||||
{
|
||||
"name": "narrow-6-keyboard-result.png",
|
||||
"bytes": 24280,
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"bytes": 24280,
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"argv": [
|
||||
"client/rapp_playwright.py",
|
||||
"--url",
|
||||
"http://127.0.0.1:18083",
|
||||
"run",
|
||||
"--spec",
|
||||
".local/independent-final-01/failure-spec.json",
|
||||
"--out",
|
||||
".local/independent-final-ui-failure-01"
|
||||
],
|
||||
"service_url": "http://127.0.0.1:18083"
|
||||
}
|
||||
|
After Width: | Height: | Size: 25 KiB |
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"id": "75c6b50e-94a1-467f-98fc-7e8937f4362e",
|
||||
"api_version": "1",
|
||||
"status": "failed",
|
||||
"error": "ui_assertion_failed",
|
||||
"label": "independent-final-ui-failure",
|
||||
"target": "fixture",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
}
|
||||
],
|
||||
"timeout_ms": 30000,
|
||||
"created_at": "2026-10-13T17:15:12.803Z",
|
||||
"expires_at": "2026-10-13T18:15:12.803Z",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
|
||||
"execution_location": "workstation-release-check",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"completed_steps": 1,
|
||||
"steps": [
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 0,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T17:15:22.422Z"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "failed",
|
||||
"at": "2026-10-13T17:15:23.542Z",
|
||||
"selector": "#count"
|
||||
}
|
||||
],
|
||||
"artifacts": [
|
||||
{
|
||||
"name": "desktop-0-before-failure.png",
|
||||
"bytes": 25740
|
||||
}
|
||||
],
|
||||
"started_at": "2026-10-13T17:15:12.806Z",
|
||||
"blocked_requests": 9,
|
||||
"finished_at": "2026-10-13T17:15:29.015Z",
|
||||
"downloads": [
|
||||
{
|
||||
"name": "desktop-0-before-failure.png",
|
||||
"bytes": 25740,
|
||||
"sha256": "141dcadca4774da5fefec835bb789c5221685d3f453070a593e69aa6ad4782ce"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"http_status": 404,
|
||||
"body": {
|
||||
"error": "not_found"
|
||||
}
|
||||
}
|
||||
140
docs/evidence/2026-10-13-independent-local-consumer.md
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
# Independent local consumer trial — 2026-10-13
|
||||
|
||||
The fresh consumer agent completed the documented Python/HTTP trial against
|
||||
`http://127.0.0.1:18081` without installing Playwright or a browser, reading
|
||||
provider source, or copying sibling fixtures. This proves the **local Docker
|
||||
container** consumer path only. Preflight and every receipt identify
|
||||
`execution_location: workstation-container`, `release: development`, service
|
||||
0.1.0, Playwright 1.64.0 and Chromium 156.0.8078.4. It does not prove a Railiance
|
||||
deployment or accept content-explorer's own task.
|
||||
|
||||
The agent first read the repository instructions and
|
||||
[consumer contract](../consumer-contract.md), then ran:
|
||||
|
||||
```sh
|
||||
python3 client/rapp_playwright.py preflight
|
||||
python3 client/rapp_playwright.py trial --out .local/independent-trial-01
|
||||
```
|
||||
|
||||
The fresh output directory was created by the documented client. Preflight
|
||||
reported browser availability; the retained follow-up
|
||||
[preflight](2026-10-13-independent-local-consumer/preflight.json) records the
|
||||
same runtime identity. The successful run
|
||||
`6b97d75c-0c39-415f-9cf4-f1813c205066` ran from
|
||||
2026-10-13T16:43:17.124Z to 16:43:30.498Z.
|
||||
|
||||
## Evidence
|
||||
|
||||
| Check | Observed result |
|
||||
| --- | --- |
|
||||
| Keyboard and assertions | All 14 steps passed across desktop and narrow contexts: visible heading, count 0, Tab, focused increment button, Enter, count 1, screenshot. |
|
||||
| PNG dimensions | Both desktop files are 1280×800; both narrow files are 390×844. Parsed the PNG IHDR directly and independently recomputed each download SHA-256. |
|
||||
| Screenshot inspection | Narrow final image visibly shows Count: 1 and an orange focus outline around Increment; no horizontal overflow is visible. This is inspection, not automated visual-baseline acceptance. |
|
||||
| Capability boundary | GET of the successful run with a deliberately incorrect bearer token returned HTTP 404 and `not_found`. |
|
||||
| Deliberate UI failure | Run `d6b71146-4f82-4d9c-bf72-4d2b672080d2` expected impossible count 99999: `ui_assertion_failed`, client exit 2, failed desktop step index 1/action text, one prior screenshot preserved. |
|
||||
| Target failure | Run `57b03fc8-4947-43a9-8c9b-058f1c46a9e0` navigated to an intentionally missing path on allowed `http://host.docker.internal:3300`: `target_unreachable`, client exit 3, zero completed steps/artifacts. Receipt does not distinguish HTTP status, connection, DNS or timeout cause. |
|
||||
| Service connection failure | Preflight against unused local service port 18089 returned `service_unreachable: establish the documented tunnel and retry`, exit 3. The real service was not stopped. |
|
||||
| Private handles | Each client-created output directory is 0700 and its run.json is 0600. No run handles or bearer capabilities are copied into retained evidence. |
|
||||
|
||||
Retained evidence:
|
||||
|
||||
- [Successful receipt](2026-10-13-independent-local-consumer/receipt.json),
|
||||
[invocation](2026-10-13-independent-local-consumer/invocation.json),
|
||||
[server trial specification](2026-10-13-independent-local-consumer/trial-spec.json)
|
||||
and [independent artifact checks](2026-10-13-independent-local-consumer/artifact-checks.json).
|
||||
- [Desktop screenshot](2026-10-13-independent-local-consumer/desktop-final.png)
|
||||
and [narrow screenshot](2026-10-13-independent-local-consumer/narrow-final.png).
|
||||
- [Wrong-token response](2026-10-13-independent-local-consumer/wrong-token.json).
|
||||
- [UI failure receipt](2026-10-13-independent-local-consumer/ui-failure-receipt.json),
|
||||
[specification](2026-10-13-independent-local-consumer/failure-spec.json),
|
||||
[invocation](2026-10-13-independent-local-consumer/ui-failure-invocation.json)
|
||||
and [preserved screenshot](2026-10-13-independent-local-consumer/ui-failure-prior-screenshot.png).
|
||||
- [Target failure receipt](2026-10-13-independent-local-consumer/target-failure-receipt.json),
|
||||
[specification](2026-10-13-independent-local-consumer/target-spec.json)
|
||||
and [invocation](2026-10-13-independent-local-consumer/target-failure-invocation.json).
|
||||
- [Client exits, unavailable service probe and permissions](2026-10-13-independent-local-consumer/client-outcomes.json).
|
||||
|
||||
## Usability findings
|
||||
|
||||
1. The first-command path worked without source inspection or dependency setup.
|
||||
Error categories distinguish assertion, target and service connection failure.
|
||||
2. At trial time, the contract's general “Client exit codes” wording did not
|
||||
explain that `status --handle` returns 0 when successfully retrieving a failed
|
||||
run. Both failed runs above reproduced this. A script must inspect JSON status;
|
||||
clarify that command-specific behavior or align its exit codes.
|
||||
3. Target diagnosis identifies the correct failure category but supplies no
|
||||
sanitized reason such as HTTP status or connection failure. The documentation
|
||||
points to browser-network reachability; more precise safe diagnostics would
|
||||
reduce operator round trips. This test makes no claim about which transport
|
||||
cause produced the observed error.
|
||||
4. At initial reading, SCOPE.md, AGENTS.md and workplans/README.md still described
|
||||
a planning-only repository despite the working client and service. The parent
|
||||
delivery session was informed; those status statements need reconciliation
|
||||
before publishing managed availability.
|
||||
|
||||
This report does not establish lifecycle cleanup, cancellation, restart recovery,
|
||||
cross-run browser state isolation, hostile-page safety, a managed endpoint, or
|
||||
consumer application acceptance; those require separate evidence.
|
||||
|
||||
## Final release verification — 2026-10-13, 17:14–17:16 UTC
|
||||
|
||||
Repeated the independent client trial against the corrected immutable release at
|
||||
`http://127.0.0.1:18083`, using fresh client output directories:
|
||||
|
||||
```sh
|
||||
python3 client/rapp_playwright.py --url http://127.0.0.1:18083 preflight
|
||||
python3 client/rapp_playwright.py --url http://127.0.0.1:18083 trial --out .local/independent-final-01
|
||||
python3 client/rapp_playwright.py --url http://127.0.0.1:18083 run --spec .local/independent-final-01/failure-spec.json --out .local/independent-final-ui-failure-01
|
||||
```
|
||||
|
||||
The release recorded by preflight and both receipts is
|
||||
`sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441`.
|
||||
Execution location is `workstation-release-check`; service 0.1.0, Playwright
|
||||
1.64.0 and Chromium 156.0.8078.4 remain unchanged. Preflight lists no allowed
|
||||
external origins, and this repeat used only the provider fixture. No external
|
||||
target, redirect diagnosis or target-unreachable probe was attempted against
|
||||
this fixture-only container.
|
||||
|
||||
Run `35124424-950a-4339-adea-45525b470cab` passed all 14 steps, from
|
||||
2026-10-13T17:14:50.055Z through 17:15:01.861Z, and the client exited 0. Independent
|
||||
PNG header/hash checks again confirmed four screenshots: two at 1280×800 and two
|
||||
at 390×844. Their hashes match the initial successful trial. The run-token
|
||||
rejection probe again returned HTTP 404 / `not_found`. The new output directory
|
||||
is 0700 and its private handle is 0600.
|
||||
|
||||
Run `75c6b50e-94a1-467f-98fc-7e8937f4362e` deliberately failed the count assertion
|
||||
at desktop step index 1 with `ui_assertion_failed`, client exit 2, and the prior
|
||||
1280×800 screenshot preserved with a verified hash. Preflight against unused
|
||||
service port 18089 again produced `service_unreachable` and exit 3. Retrieving the
|
||||
failed run with `--url http://127.0.0.1:18083 status --handle` succeeded with exit 0, now explicitly documented
|
||||
in the consumer contract. AGENTS.md and README.md now describe implemented
|
||||
verification commands and distinguish local evidence from managed availability.
|
||||
|
||||
Recovery usability detail: `--url` must also be repeated on `status` for a
|
||||
nondefault endpoint. The first status invocation omitted it, queried the default
|
||||
18081 service and returned HTTP 404 / exit 3; repeating with the correct 18083
|
||||
override returned the expected failed-run receipt / exit 0. The private handle
|
||||
does not automatically select the originating service URL.
|
||||
|
||||
Retained final evidence:
|
||||
|
||||
- [Preflight](2026-10-13-independent-final-consumer/preflight.json),
|
||||
[successful receipt](2026-10-13-independent-final-consumer/receipt.json),
|
||||
[invocation](2026-10-13-independent-final-consumer/invocation.json),
|
||||
[artifact checks](2026-10-13-independent-final-consumer/artifact-checks.json),
|
||||
[wrong-token response](2026-10-13-independent-final-consumer/wrong-token.json)
|
||||
and [client outcomes](2026-10-13-independent-final-consumer/client-outcomes.json).
|
||||
- [Desktop final](2026-10-13-independent-final-consumer/desktop-final.png),
|
||||
[desktop keyboard](2026-10-13-independent-final-consumer/desktop-6-keyboard-result.png),
|
||||
[narrow final](2026-10-13-independent-final-consumer/narrow-final.png)
|
||||
and [narrow keyboard](2026-10-13-independent-final-consumer/narrow-6-keyboard-result.png).
|
||||
- [Failed assertion receipt](2026-10-13-independent-final-consumer/ui-failure-receipt.json),
|
||||
[specification](2026-10-13-independent-final-consumer/failure-spec.json),
|
||||
[invocation](2026-10-13-independent-final-consumer/ui-failure-invocation.json)
|
||||
and [preserved screenshot](2026-10-13-independent-final-consumer/ui-failure-prior-screenshot.png).
|
||||
|
||||
These are local final-release consumer checks. Read-only root configuration,
|
||||
worker temporary-directory isolation and crash cleanup were reported by the
|
||||
provider; this consumer trial does not independently inspect or establish those
|
||||
properties. Managed platform admission remains pending, and no Railiance
|
||||
deployment or content-explorer acceptance is claimed.
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
[
|
||||
{
|
||||
"name": "desktop-6-keyboard-result.png",
|
||||
"dimensions": [
|
||||
1280,
|
||||
800
|
||||
],
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"dimensions": [
|
||||
1280,
|
||||
800
|
||||
],
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "narrow-6-keyboard-result.png",
|
||||
"dimensions": [
|
||||
390,
|
||||
844
|
||||
],
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
|
||||
"bytes": 24280
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"dimensions": [
|
||||
390,
|
||||
844
|
||||
],
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
|
||||
"bytes": 24280
|
||||
}
|
||||
]
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
{
|
||||
"trial_exit": 0,
|
||||
"intentional_ui_failure_exit": 2,
|
||||
"target_failure_exit": 3,
|
||||
"failed_ui_status_command_exit": 0,
|
||||
"failed_target_status_command_exit": 0,
|
||||
"unavailable_service_preflight": {
|
||||
"argv": [
|
||||
"python3",
|
||||
"client/rapp_playwright.py",
|
||||
"--url",
|
||||
"http://127.0.0.1:18089",
|
||||
"preflight"
|
||||
],
|
||||
"exit": 3,
|
||||
"response": {
|
||||
"error": "service_unreachable: establish the documented tunnel and retry"
|
||||
}
|
||||
},
|
||||
"permissions": {
|
||||
".local/independent-trial-01": {
|
||||
"directory_mode": "0o700",
|
||||
"handle_mode": "0o600"
|
||||
},
|
||||
".local/independent-ui-failure-01": {
|
||||
"directory_mode": "0o700",
|
||||
"handle_mode": "0o600"
|
||||
},
|
||||
".local/independent-target-failure-01": {
|
||||
"directory_mode": "0o700",
|
||||
"handle_mode": "0o600"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 26 KiB |
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"api_version": "1",
|
||||
"target": "fixture",
|
||||
"label": "independent-intentional-ui-failure",
|
||||
"timeout_ms": 30000,
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
{
|
||||
"action": "screenshot",
|
||||
"name": "before-failure"
|
||||
},
|
||||
{
|
||||
"action": "text",
|
||||
"selector": "#count",
|
||||
"value": "99999"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"argv": [
|
||||
"client/rapp_playwright.py",
|
||||
"trial",
|
||||
"--out",
|
||||
".local/independent-trial-01"
|
||||
],
|
||||
"service_url": "http://127.0.0.1:18081"
|
||||
}
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"available": true,
|
||||
"error": null,
|
||||
"checked_at": "2026-10-13T16:43:51.651Z",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"api_version": "1",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"execution_location": "workstation-container",
|
||||
"release": "development",
|
||||
"allowed_origins": [
|
||||
"http://host.docker.internal:3300",
|
||||
"https://onco.cc"
|
||||
],
|
||||
"fixture": true,
|
||||
"active": 1,
|
||||
"queued": 0,
|
||||
"limits": {
|
||||
"concurrency": 1,
|
||||
"max_queue": 4,
|
||||
"max_timeout_ms": 120000,
|
||||
"retention_ms": 3600000,
|
||||
"max_runs": 64
|
||||
}
|
||||
}
|
||||
184
docs/evidence/2026-10-13-independent-local-consumer/receipt.json
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
{
|
||||
"id": "6b97d75c-0c39-415f-9cf4-f1813c205066",
|
||||
"api_version": "1",
|
||||
"status": "passed",
|
||||
"error": null,
|
||||
"label": "independent-browser-trial",
|
||||
"target": "fixture",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
},
|
||||
{
|
||||
"name": "narrow",
|
||||
"width": 390,
|
||||
"height": 844
|
||||
}
|
||||
],
|
||||
"timeout_ms": 60000,
|
||||
"created_at": "2026-10-13T16:43:17.082Z",
|
||||
"expires_at": "2026-10-13T17:43:17.082Z",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"release": "development",
|
||||
"execution_location": "workstation-container",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"completed_steps": 14,
|
||||
"steps": [
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 0,
|
||||
"action": "visible",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:27.379Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:27.722Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 2,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:27.838Z",
|
||||
"key": "Tab"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 3,
|
||||
"action": "focused",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:27.884Z",
|
||||
"selector": "#increment"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 4,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:28.011Z",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 5,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:28.027Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 6,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:28.052Z"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 0,
|
||||
"action": "visible",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:29.234Z",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:29.476Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 2,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:29.640Z",
|
||||
"key": "Tab"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 3,
|
||||
"action": "focused",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:29.663Z",
|
||||
"selector": "#increment"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 4,
|
||||
"action": "press",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:29.757Z",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 5,
|
||||
"action": "text",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:29.773Z",
|
||||
"selector": "#count"
|
||||
},
|
||||
{
|
||||
"viewport": "narrow",
|
||||
"index": 6,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:43:29.814Z"
|
||||
}
|
||||
],
|
||||
"artifacts": [
|
||||
{
|
||||
"name": "desktop-6-keyboard-result.png",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"bytes": 26622
|
||||
},
|
||||
{
|
||||
"name": "narrow-6-keyboard-result.png",
|
||||
"bytes": 24280
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"bytes": 24280
|
||||
}
|
||||
],
|
||||
"started_at": "2026-10-13T16:43:17.124Z",
|
||||
"blocked_requests": 0,
|
||||
"finished_at": "2026-10-13T16:43:30.498Z",
|
||||
"downloads": [
|
||||
{
|
||||
"name": "desktop-6-keyboard-result.png",
|
||||
"bytes": 26622,
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
|
||||
},
|
||||
{
|
||||
"name": "desktop-final.png",
|
||||
"bytes": 26622,
|
||||
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
|
||||
},
|
||||
{
|
||||
"name": "narrow-6-keyboard-result.png",
|
||||
"bytes": 24280,
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
|
||||
},
|
||||
{
|
||||
"name": "narrow-final.png",
|
||||
"bytes": 24280,
|
||||
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"argv": [
|
||||
"client/rapp_playwright.py",
|
||||
"run",
|
||||
"--spec",
|
||||
".local/independent-trial-01/target-spec.json",
|
||||
"--out",
|
||||
".local/independent-target-failure-01"
|
||||
],
|
||||
"service_url": "http://127.0.0.1:18081"
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"id": "57b03fc8-4947-43a9-8c9b-058f1c46a9e0",
|
||||
"api_version": "1",
|
||||
"status": "failed",
|
||||
"error": "target_unreachable",
|
||||
"label": "independent-target-http-failure",
|
||||
"target": "http://host.docker.internal:3300/independent-trial-deliberately-missing-page-20261013",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
}
|
||||
],
|
||||
"timeout_ms": 30000,
|
||||
"created_at": "2026-10-13T16:44:48.609Z",
|
||||
"expires_at": "2026-10-13T17:44:48.609Z",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"release": "development",
|
||||
"execution_location": "workstation-container",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"completed_steps": 0,
|
||||
"steps": [],
|
||||
"artifacts": [],
|
||||
"started_at": "2026-10-13T16:44:48.614Z",
|
||||
"blocked_requests": 0,
|
||||
"finished_at": "2026-10-13T16:45:11.290Z",
|
||||
"downloads": []
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"api_version": "1",
|
||||
"target": "http://host.docker.internal:3300/independent-trial-deliberately-missing-page-20261013",
|
||||
"label": "independent-target-http-failure",
|
||||
"timeout_ms": 30000,
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
}
|
||||
],
|
||||
"steps": [
|
||||
{
|
||||
"action": "visible",
|
||||
"selector": "h1"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"api_version": "1",
|
||||
"target": "fixture",
|
||||
"label": "independent-browser-trial",
|
||||
"steps": [
|
||||
{
|
||||
"action": "visible",
|
||||
"selector": "h1"
|
||||
},
|
||||
{
|
||||
"action": "text",
|
||||
"selector": "#count",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"action": "press",
|
||||
"key": "Tab"
|
||||
},
|
||||
{
|
||||
"action": "focused",
|
||||
"selector": "#increment"
|
||||
},
|
||||
{
|
||||
"action": "press",
|
||||
"key": "Enter"
|
||||
},
|
||||
{
|
||||
"action": "text",
|
||||
"selector": "#count",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"action": "screenshot",
|
||||
"name": "keyboard-result"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"argv": [
|
||||
"client/rapp_playwright.py",
|
||||
"run",
|
||||
"--spec",
|
||||
".local/independent-trial-01/failure-spec.json",
|
||||
"--out",
|
||||
".local/independent-ui-failure-01"
|
||||
],
|
||||
"service_url": "http://127.0.0.1:18081"
|
||||
}
|
||||
|
After Width: | Height: | Size: 25 KiB |
|
|
@ -0,0 +1,57 @@
|
|||
{
|
||||
"id": "d6b71146-4f82-4d9c-bf72-4d2b672080d2",
|
||||
"api_version": "1",
|
||||
"status": "failed",
|
||||
"error": "ui_assertion_failed",
|
||||
"label": "independent-intentional-ui-failure",
|
||||
"target": "fixture",
|
||||
"viewports": [
|
||||
{
|
||||
"name": "desktop",
|
||||
"width": 1280,
|
||||
"height": 800
|
||||
}
|
||||
],
|
||||
"timeout_ms": 30000,
|
||||
"created_at": "2026-10-13T16:44:28.954Z",
|
||||
"expires_at": "2026-10-13T17:44:28.954Z",
|
||||
"service_version": "0.1.0",
|
||||
"playwright_version": "1.64.0",
|
||||
"release": "development",
|
||||
"execution_location": "workstation-container",
|
||||
"browser_version": "156.0.8078.4",
|
||||
"completed_steps": 1,
|
||||
"steps": [
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 0,
|
||||
"action": "screenshot",
|
||||
"status": "passed",
|
||||
"at": "2026-10-13T16:44:41.184Z"
|
||||
},
|
||||
{
|
||||
"viewport": "desktop",
|
||||
"index": 1,
|
||||
"action": "text",
|
||||
"status": "failed",
|
||||
"at": "2026-10-13T16:44:41.508Z",
|
||||
"selector": "#count"
|
||||
}
|
||||
],
|
||||
"artifacts": [
|
||||
{
|
||||
"name": "desktop-0-before-failure.png",
|
||||
"bytes": 25740
|
||||
}
|
||||
],
|
||||
"started_at": "2026-10-13T16:44:36.279Z",
|
||||
"blocked_requests": 0,
|
||||
"finished_at": "2026-10-13T16:44:46.861Z",
|
||||
"downloads": [
|
||||
{
|
||||
"name": "desktop-0-before-failure.png",
|
||||
"bytes": 25740,
|
||||
"sha256": "141dcadca4774da5fefec835bb789c5221685d3f453070a593e69aa6ad4782ce"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"http_status": 404,
|
||||
"body": {
|
||||
"error": "not_found"
|
||||
}
|
||||
}
|
||||
9
docs/evidence/2026-10-13-missing-browser.log
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
✔ missing browser fails preflight and prevents admission (3280.374816ms)
|
||||
ℹ tests 1
|
||||
ℹ suites 0
|
||||
ℹ pass 1
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4049.467658
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"id": "e77247e5-ce25-4711-a64f-af81a9f7cbb1",
|
||||
"from_agent": "rapp-playwright",
|
||||
"to_agent": "railiance-platform",
|
||||
"subject": "Browser package ready locally; admission and Forgejo OCI upload blockers",
|
||||
"body": "Founder explicitly selected railiance-platform lifecycle ownership. Final source implementation and independent client evidence are in rapp-playwright; candidate local OCI index sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441, Playwright1.64.0/Chromium156.0.8078.4. Read-only Docker integration4/4 plus missing-browser negative1/1; independent final trial passed. No cluster mutation. Current node92.205.62.239 Ready, requests3460m/4CPU and9472Mi; package100m/256Mi limit1CPU/1Gi,2GiPVC,loopbackRBAC,Recreate. OCI publication to forgejo.coulomb.social/coulomb/rapp-playwright:0.1.0 failed repeatedly at final blob PUT: HTTP499 then500, including digests9a29e489bcc76cee14bece1a90741a2a7512f0c69ffefbe7f5d17500f24d8ba5 and071058c704d16066a57f826f0df652f0f8780f9e825cbf4242946b68f4fa79e0. Smaller layers uploaded; manifest publication not established. Please confirm admission/access lane and diagnose registry large-blob failures in owner scope. WP0003-T01 and WP0004-T01 remain explicit waits. Evidence/docs and sync commit will be in repo; no secret or credential request.",
|
||||
"thread_id": "c82d75f3-3191-410d-a8c8-fd647bf7f3ef",
|
||||
"read_at": null,
|
||||
"archived_at": null,
|
||||
"created_at": "2026-10-13T17:18:22.948833Z",
|
||||
"kind": "message",
|
||||
"expires_at": null,
|
||||
"supersedes_id": null,
|
||||
"reader": null,
|
||||
"delivered_at": null,
|
||||
"acknowledged_at": null
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"id": "30503ee1-77f9-4e9e-a63a-2f70ac097823",
|
||||
"from_agent": "rapp-playwright",
|
||||
"to_agent": "reuse-surface",
|
||||
"subject": "rapp-playwright implemented: independent local consumer evidence; managed admission pending",
|
||||
"body": "WP-0004 provider handoff: service and Python stdlib client implemented in /home/worsch/rapp-playwright. docs/consumer-contract.md is the v1 command/API contract. docs/evidence/2026-10-13-independent-local-consumer.md retains independent successful fixture, two viewports, keyboard evidence, wrong-token/UI/target/service negatives. docs/content-explorer-pilot.md maps the pinned OnCo home-page pilot. make test-integration now passes real Chromium isolation, proxy redirects, cancellation/timeout/crash/restart/expiry under read-only Docker. Playwright 1.64.0 / Chromium 156.0.8078.4. Founder selected railiance-platform lifecycle ownership; managed admission remains pending (c82d75f3-3191-410d-a8c8-fd647bf7f3ef), so do not claim Railiance availability. Please update existing capability.infotech.headless-browser with local verified provider contract/evidence and the conditional managed command, then return published discovery readback. Keep source-only fallback explicit. Source commit/immutable image evidence will follow in docs/evidence. No duplicate capability.",
|
||||
"thread_id": null,
|
||||
"read_at": null,
|
||||
"archived_at": null,
|
||||
"created_at": "2026-10-13T17:12:22.927559Z",
|
||||
"kind": "message",
|
||||
"expires_at": null,
|
||||
"supersedes_id": null,
|
||||
"reader": null,
|
||||
"delivered_at": null,
|
||||
"acknowledged_at": null
|
||||
}
|
||||