diff --git a/README.md b/README.md index fff439c..60be666 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,11 @@ is not a deepfake classifier and not cryptographic proof. Entry for the OpenCV AI Competition 2026 (OpenCV 5 + AWS). The specification is in [SPEC.md](SPEC.md); current status is in [docs/PROGRESS.md](docs/PROGRESS.md). -- Endpoint: see [docs/JUDGE_GUIDE.md](docs/JUDGE_GUIDE.md) +- Live app (AWS, HTTPS): https://5u7suz00bi.execute-api.us-east-1.amazonaws.com — guide in [docs/JUDGE_GUIDE.md](docs/JUDGE_GUIDE.md) - Technical report: [docs/TECHNICAL_REPORT.md](docs/TECHNICAL_REPORT.md) - Architecture: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · diagrams in [docs/diagrams/](docs/diagrams/) - Responsible use: [docs/RESPONSIBLE_USE.md](docs/RESPONSIBLE_USE.md) -- Video: (not recorded yet — human task H8) +- Video: the link is added at submission (at most 5 minutes) ## What is in the repository @@ -30,7 +30,7 @@ status is in [docs/PROGRESS.md](docs/PROGRESS.md). | Camera calibration rig | `calibration_rig/` | | AWS infrastructure (CDK v2) | `infra/` | | Simulator and evaluation | `eval/` | -| COOL benchmark | `bench/` | +| Graviton vs x86 benchmark (COOL-ready) | `bench/` | ## Quick start (local) diff --git a/agent/orchestrator.py b/agent/orchestrator.py index 05631ff..1739a8b 100644 --- a/agent/orchestrator.py +++ b/agent/orchestrator.py @@ -7,6 +7,7 @@ import json import os import sys +from contextlib import AsyncExitStack from pathlib import Path from typing import Any, Protocol @@ -32,16 +33,65 @@ class ToolCaller(Protocol): async def call(self, tool: str, args: dict[str, Any]) -> dict[str, Any]: ... +class ConnectionLost(Exception): + """The MCP server process stopped answering (e.g. it was killed); the call can be retried on a new server.""" + + class McpCaller: def __init__(self, session: ClientSession): self.session = session async def call(self, tool: str, args: dict[str, Any]) -> dict[str, Any]: - res = await self.session.call_tool(tool, args) + try: + res = await self.session.call_tool(tool, args) + except Exception as e: + raise ConnectionLost(f"{type(e).__name__}: {e}") from e text = "".join(getattr(c, "text", "") for c in res.content) if res.isError: raise RuntimeError(text or f"{tool} failed") - return json.loads(text) if text else {} + if not text: # every engine tool returns a JSON object; an empty reply means the server is gone + raise ConnectionLost(f"{tool}: empty reply from MCP server") + return dict(json.loads(text)) + + +class RestartingMcpCaller: + """McpCaller that starts the MCP server on demand and, if the server process is lost, starts a new one and + retries the call once. Job state lives in the job store, so a new server continues the same job.""" + + def __init__(self, params: StdioServerParameters): + self.params = params + self.stack: AsyncExitStack | None = None + self.caller: McpCaller | None = None + self.restarts = 0 + + async def _start(self) -> McpCaller: + await self.aclose() + self.stack = AsyncExitStack() + read, write = await self.stack.enter_async_context(stdio_client(self.params)) + session = await self.stack.enter_async_context(ClientSession(read, write)) + await session.initialize() + self.caller = McpCaller(session) + return self.caller + + async def call(self, tool: str, args: dict[str, Any]) -> dict[str, Any]: + for attempt in range(2): + caller = self.caller or await self._start() + try: + return await caller.call(tool, args) + except ConnectionLost: + self.caller = None + self.restarts += 1 + if attempt: + raise + raise AssertionError("unreachable") + + async def aclose(self) -> None: + stack, self.stack, self.caller = self.stack, None, None + if stack is not None: + try: + await stack.aclose() + except Exception: # noqa: BLE001 - the old server is already gone; nothing to clean up + pass _PREREQ_FREE = {"probe_video", "compute_verdict", "request_user_input", "request_human_review", "render_report"} @@ -126,9 +176,11 @@ async def run_with_mcp(job_id: str, planner: Planner, max_iterations: int, max_t params = StdioServerParameters(command=sys.executable, args=["-m", "mcp_server.server"], env={**os.environ, **env, "PYTHONPATH": f"{REPO}{os.pathsep}{REPO / 'engine'}"}, cwd=str(REPO)) - async with stdio_client(params) as (read, write), ClientSession(read, write) as session: - await session.initialize() - return await run_job(job_id, planner, McpCaller(session), max_iterations, max_tool_calls, trace_path) + caller = RestartingMcpCaller(params) + try: + return await run_job(job_id, planner, caller, max_iterations, max_tool_calls, trace_path) + finally: + await caller.aclose() def run_sync(job_id: str, planner: Planner, max_iterations: int, max_tool_calls: int, env: dict[str, str], diff --git a/agent/tests/test_agent.py b/agent/tests/test_agent.py index 20b73d5..c871b94 100644 --- a/agent/tests/test_agent.py +++ b/agent/tests/test_agent.py @@ -263,3 +263,36 @@ def test_policy_drops_invalid_argument_values(): st.verdict_done, st.verdict = True, "INCONCLUSIVE" a, _ = policies.enforce(Action("render", {}, "x"), st) assert a.tool == "render_report" + + +def test_restarting_caller_restarts_lost_server_and_retries_once(): + import asyncio + + from agent.orchestrator import ConnectionLost, RestartingMcpCaller + + class Dead: + async def call(self, tool, args): + raise ConnectionLost("Connection closed") + + class Alive: + async def call(self, tool, args): + return {"tool": tool} + + servers = [Dead(), Alive()] + c = RestartingMcpCaller(params=None) # type: ignore[arg-type] + + async def start(): + c.caller = servers.pop(0) + return c.caller + + c._start = start # type: ignore[method-assign] + assert asyncio.run(c.call("analyze_motion", {"job_id": "j"})) == {"tool": "analyze_motion"} + assert c.restarts == 1 + + servers[:] = [Dead(), Dead()] + c.caller = None + try: + asyncio.run(c.call("analyze_motion", {"job_id": "j"})) + raise AssertionError("expected ConnectionLost") + except ConnectionLost: + pass diff --git a/api/app.py b/api/app.py index cf92047..d473689 100644 --- a/api/app.py +++ b/api/app.py @@ -112,6 +112,13 @@ async def upload(job_id: str, request: Request) -> dict[str, Any]: @app.post("/v1/jobs/{job_id}/start") def start(job_id: str, body: StartBody) -> dict[str, Any]: job = get_job(job_id) + if job["status"] == "created" and hasattr(ctx.storage, "uploaded_size"): + # AWS: the browser uploaded straight to S3 with the presigned URL, so the API never saw the bytes + size = ctx.storage.uploaded_size(job["upload_key"]) + if size is not None: + if size > limits["max_file_bytes"]: + raise HTTPException(413, "file too large") + job.update({"status": "uploaded", "size_bytes": size}) if job["status"] not in ("uploaded", "done", "failed"): raise HTTPException(409, f"job status is {job['status']}") if body.sidecar is not None: diff --git a/api/aws_adapters.py b/api/aws_adapters.py index c33652f..90467ff 100644 --- a/api/aws_adapters.py +++ b/api/aws_adapters.py @@ -8,6 +8,7 @@ from typing import Any import boto3 +from botocore.config import Config from gridprint_engine.adapters import JobStoreAdapter, StorageAdapter @@ -16,7 +17,8 @@ class S3Storage(StorageAdapter): def __init__(self, results_bucket: str, uploads_bucket: str, region: str, expiry_s: int): - self.s3 = boto3.client("s3", region_name=region) + # SigV4 is required for presigned PUTs to a bucket with SSE-KMS default encryption + self.s3 = boto3.client("s3", region_name=region, config=Config(signature_version="s3v4")) self.results, self.uploads, self.expiry = results_bucket, uploads_bucket, expiry_s def _bucket(self, key: str) -> str: @@ -36,10 +38,17 @@ def url(self, key: str) -> str: ExpiresIn=self.expiry)) def presign_put(self, key: str) -> str: - return str(self.s3.generate_presigned_url("put_object", Params={"Bucket": self.uploads, "Key": key, - "ContentType": "video/mp4"}, + # no ContentType in the signature: browsers send the file's own type (video/mp4, video/quicktime, ...) + return str(self.s3.generate_presigned_url("put_object", Params={"Bucket": self.uploads, "Key": key}, ExpiresIn=self.expiry)) + def uploaded_size(self, key: str) -> int | None: + """Size of an object uploaded directly to S3 through a presigned URL, or None if it is not there.""" + try: + return int(self.s3.head_object(Bucket=self._bucket(key), Key=key)["ContentLength"]) + except self.s3.exceptions.ClientError: + return None + class DynamoJobStore(JobStoreAdapter): """Items are stored as {pk, data(JSON string)}; tables other than Jobs/Reviews/TraceIndex go to Jobs with a diff --git a/bench/inputs.txt b/bench/inputs.txt index 4659b86..c4bfab7 100644 --- a/bench/inputs.txt +++ b/bench/inputs.txt @@ -1,4 +1,2 @@ -# sha256 video sidecar gridlog-root (SYNTHETIC clips from eval/simulator/suites.py) -ab2f7e2c226048ab4b77a10156538f5f68216d69d0bc33607a2a7c24f27a8387 data/synthetic/v1/clean__s1000.mp4 data/synthetic/v1/clean__s1000.sidecar.json data/synthetic/v1/gridlog/clean__s1000 -cbaac48734a453a0f3ba58f23c7bceca5cf55a67d07892a1f877291dd068376a data/synthetic/v1/camera_motion__s1060.mp4 data/synthetic/v1/camera_motion__s1060.sidecar.json data/synthetic/v1/gridlog/camera_motion__s1060 -77b87f3d115f3f920e8b9b1aaabb9ee6bba662c5672021d36bb9eb98e9910257 data/synthetic/v1/moving_objects__s1070.mp4 data/synthetic/v1/moving_objects__s1070.sidecar.json data/synthetic/v1/gridlog/moving_objects__s1070 +# sha256 video sidecar gridlog-root (REAL footage: public CC BY-SA 3.0 clip "Fluorescent beat effect" from Wikimedia Commons, mp4 transcode of the .ogv in docs/LICENSES.md) +b1101d4f30371132a23ddf4da29e03dc48db9731ba04b0fffb81d3afb5474db4 data/public/fluorescent_beat_effect.mp4 - data/gridlog_empty diff --git a/config/thresholds.yaml b/config/thresholds.yaml index 44d7f3b..55a5a12 100644 --- a/config/thresholds.yaml +++ b/config/thresholds.yaml @@ -1,16 +1,28 @@ -# PROVISIONAL — development placeholders. Must be replaced by eval/calibrate_thresholds.py (R8). -provenance: - status: PROVISIONAL - generated_by: hand-written placeholder signal: - snr_absent_db: 3.0 - snr_weak_db: 8.0 + snr_absent_db: 0.0 + snr_weak_db: 4.0 match: min_track_s: 20 - rho1_min: 0.7 - margin_min: 0.15 + rho1_min: 0.8 + margin_min: 0.01 continuity: - edit_significance_sigma: 6.0 - edit_min_rad: 0.6 + edit_significance_sigma: 10.0 + edit_min_rad: 0.1 facecheck: ratio_anomaly: 0.5 +provenance: + status: PROVISIONAL + note: 'PROVISIONAL: calibrated on SYNTHETIC data only; recalibrate on the real dataset + (M9, H5)' + generated_by: eval/calibrate_thresholds.py v1.0 + date: '2026-10-27T03:48:08.984059+00:00' + run_dir: results\eval\2026-10-27\synthetic-v1-fallback + calibration_clips: 22 + data_sha256: ed8004b5b62e0c1b910bdb438edc8e00ddf9a837b8e5b43f44e496bbcb9de5df + target_false_contradicted_rate: 0.01 + calibration_fit: + false_contradicted: 0.0 + coverage: 0.5625 + wrong_time: 0 + edit_detection: 0.4 + n_auth: 17 diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index f38dcdc..94b8583 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -20,7 +20,7 @@ The components below are the system design. All components have code in the repo | Jobs queue | CDK in `infra/` | Amazon SQS | Decouples the API from the engine workers. Worker autoscaling uses queue depth. | | Engine worker | `engine/`, `agent/`, `mcp_server/` | Amazon ECS on Graviton4 `c8g`, `linux/arm64`, OpenCV 5 (stock wheel); COOL AMI supported by the stack when `aws.cool_ami_id` is set | One task holds the agent orchestrator, the MCP client, and the MCP server `gridprint-engine` (stdio transport). | | GRIDPRINT Engine | `engine/gridprint_engine/` | inside the worker | OpenCV 5 analysis stages S1–S15 (SPEC Part 8). Python package with no AWS imports. | -| GRIDPRINT Agent | `agent/` | inside the worker | Plans and adapts the analysis with engine tools. Planner: Claude on Amazon Bedrock, or the deterministic fallback planner. Never writes a verdict. | +| GRIDPRINT Agent | `agent/` | inside the worker | Plans and adapts the analysis with engine tools. Planner: an LLM on Amazon Bedrock (Amazon Nova Lite through a cross-account role, D-026), with the deterministic fallback planner for any failed model step. Never writes a verdict. | | Reference Store | DynamoDB `GridLog` | Amazon DynamoDB | Grid frequency per zone and UTC second. Key `zone#YYYYMMDD` + epoch second. | | GRIDPRINT Node | `node/` | ESP32 + GPS PPS at a mains socket (through a certified plug-in AC-to-AC adapter) | Measures grid frequency each UTC second. Publishes over MQTT/TLS to AWS IoT Core. | | Ingest | `node/ingest/` | AWS Lambda (IoT topic rule) | Writes Node samples to `GridLog`. Median over nodes in one zone. | @@ -28,7 +28,7 @@ The components below are the system design. All components have code in the repo | Stores | CDK | Amazon DynamoDB, Amazon S3 | `Jobs`, `Reviews`, `GridLog`, `TraceIndex` tables. Upload and results buckets with SSE-KMS and lifecycle deletion. | | Observability | CDK | Amazon CloudWatch | Structured JSON logs, metrics, dashboards (jobs, stage latency, verdict counts, agent iterations, errors, Node freshness), alarms. | | Evaluation | `eval/` | developer machine or AWS | Simulator, dataset validator, edit generator, threshold calibration, reports into `results/`. | -| Benchmark | `bench/` | EC2 instances (configs A, B, C) | COOL vs stock OpenCV 5 on Graviton vs x86 (SPEC Part 12). | +| Benchmark | `bench/` | EC2 instances (configs A, B, C) | Stock OpenCV 5 on x86 (A) and Graviton (B), COOL on Graviton (C) (SPEC Part 12). A and B ran on 2026-10-27 (`results/bench/2026-10-27/`); C waits for the COOL subscription. | ## 3. Data flow for one job @@ -81,7 +81,7 @@ The engine has no AWS imports. All access to storage and data goes through three ## 6. Agent and MCP -- The orchestrator (`agent/orchestrator.py`) runs the planner loop. The planner is `planner_bedrock.py` (Claude on Amazon Bedrock, model ID pinned in `config/default.yaml`) or `fallback_planner.py` (rules for B1–B6). +- The orchestrator (`agent/orchestrator.py`) runs the planner loop. The planner is `planner_bedrock.py` (Amazon Bedrock Converse API with tool use, model ID pinned in `config/default.yaml`) or `fallback_planner.py` (rules for B1–B6). - `config/default.yaml` sets `agent.planner: bedrock` with `bedrock.model_id: us.amazon.nova-lite-v1:0`, called through a cross-account role (D-026). The fallback planner runs any step where the model call fails, and the trace records which planner made each decision. - `policies.py` enforces budgets and order rules in code, not only in the prompt. - The MCP server `gridprint-engine` runs in the same worker task as the orchestrator. Transport: stdio. @@ -92,8 +92,8 @@ The engine has no AWS imports. All access to storage and data goes through three - Production engine containers are `linux/arm64` and run on Graviton `c8g` instances. The API runs on Fargate `linux/arm64`. - The `linux/amd64` engine image exists only for the x86 baseline of the COOL benchmark (SPEC Part 12, configuration A). It is not deployed in the production stack. - Images are built by `infra/build_images.py`: the `linux/arm64` images on a Graviton EC2 build instance, from the committed tree, and pushed to Amazon ECR. The `linux/amd64` engine image (benchmark only) is built with `--amd64`. All engine images use `infra/docker/engine.Dockerfile`, the same engine code, the same pinned Python dependencies (`uv.lock`), and the same OpenCV 5 release (`opencv-python-headless==5.0.0.93`, DECISIONS D-003). Configuration C replaces stock OpenCV 5 with the COOL build on Graviton. -- The benchmark parity check compares ENF tracks and verdicts from A, B, and C. -- If COOL cannot be obtained (V5), production runs stock OpenCV 5 on Graviton, the reason is documented, and the COOL award is not claimed. +- The benchmark parity check compares ENF tracks and verdicts across configurations (A and B so far). +- COOL is not active (V5: Marketplace subscription pending, H1). Production runs stock OpenCV 5 on Graviton, and the COOL award is not claimed. ## 8. Security boundaries diff --git a/docs/HUMAN_TASKS.md b/docs/HUMAN_TASKS.md index 91eda04..347d015 100644 --- a/docs/HUMAN_TASKS.md +++ b/docs/HUMAN_TASKS.md @@ -4,23 +4,16 @@ Status values: `BLOCKED-HUMAN` (waiting for a person), `DONE` (validated by scri --- -## H1 — AWS account, account verification, quotas, Bedrock access, COOL subscription — BLOCKED-HUMAN - -Done (2026-10-27): steps 1–3 (account 643700104680, deployer access, CLI profile `gridprint` in `us-east-1`) and the CDK bootstrap. Nine stacks are deployed (`docs/TECHNICAL_REPORT.md` §6). - -Done steps, for reference: -1. Sign in to the AWS account you will use for the competition. -2. Create an IAM user or IAM Identity Center permission set for deployment. Attach the policy in `infra/iam/deployer-policy.json`. -3. On this machine, create the CLI profile named `gridprint` in region `us-east-1`: `aws configure --profile gridprint` (or `aws configure sso --profile gridprint`). Do not put keys in the repository. -4. Bootstrap CDK once: `npx aws-cdk@2 bootstrap --profile gridprint`. - -Open items (each needs the account owner): -1. **AWS account verification.** AWS Console → Support Center → open the case or notice about account verification and complete it. This unblocks CloudFront (the Web stack) and Amazon Bedrock. -2. **EC2 vCPU quota increase.** AWS Console → Service Quotas → Amazon EC2 → "Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances" (`L-1216C47A`) → Request increase. Ask for at least 32 vCPUs. This restores the default worker size and allows the benchmark instances (D-024). -3. **Bedrock model access.** After verification: Bedrock console (`us-east-1`) → Model access → enable Anthropic Claude Sonnet 4.6. Accept the Anthropic use-case form if asked. Then set `bedrock.enabled: true` and `agent.planner: bedrock` in `config/default.yaml`. -4. **COOL subscription.** Open the AWS Marketplace listing "Cloud Optimized OpenCV For AWS Graviton4" (`https://aws.amazon.com/marketplace/pp/prodview-fdvbfiewzuehs`) and subscribe. Note the AMI ID for `us-east-1` and put it in `config/default.yaml` under `aws.cool_ami_id`. -5. **Budget alarm.** If it does not exist yet: AWS Console → Billing → Budgets → Create budget → Cost budget, with an email alarm at 80 % of your limit. -6. Validate: +## H1 — AWS account: remaining items — BLOCKED-HUMAN + +Done (2026-10-27): account 643700104680, deployer access, CLI profile `gridprint` in `us-east-1`, CDK bootstrap. Nine of ten stacks are deployed; the public endpoint is https://5u7suz00bi.execute-api.us-east-1.amazonaws.com (API Gateway, D-025); the planner runs on Amazon Nova Lite through a cross-account role (D-026). Evidence: `results/aws/`. + +Remaining items (each needs the account owner): +1. **AWS account verification (unblocks CloudFront).** AWS Console → Support Center → open the account-verification case or notice and complete it. Then run `make deploy` to add the Web stack (CloudFront). +2. **EC2 vCPU quota increase.** AWS Console → Service Quotas → Amazon EC2 → "Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances" (`L-1216C47A`) → Request increase to at least 32 vCPUs. This restores the default worker size and allows the benchmark instances (D-024). +3. **Claude model access through AWS Marketplace needs a valid payment method.** AWS Console → Billing and Cost Management → Payment preferences → add or fix a valid payment method. Then Bedrock console (`us-east-1`) → Model access → enable Anthropic Claude Sonnet 4.6 (accept the Anthropic use-case form if asked). Only after that, switch the planner model in `config/default.yaml`. Until then the planner stays on Amazon Nova Lite (D-026). +4. **COOL subscription.** Open the AWS Marketplace listing "Cloud Optimized OpenCV For AWS Graviton4" (`https://aws.amazon.com/marketplace/pp/prodview-fdvbfiewzuehs`) and subscribe (needs the payment method from item 3). Put the `us-east-1` AMI ID in `config/default.yaml` under `aws.cool_ami_id`. +5. Validate: ```bash make verify-aws ``` @@ -64,7 +57,7 @@ Open items (each needs the account owner): ## H5 — Record the real dataset — BLOCKED-HUMAN -### H5-a — Download the public ENF video datasets (needs your login; the agent cannot create accounts) +### H5-a — Download the public ENF video datasets (needs your login; the agent cannot create accounts) — BLOCKED-HUMAN Both sets have real rolling-shutter videos plus a recorded mains reference. 1. EV-ENFD (Xu et al., CVPR 2023, code MIT): open the TeraBox link in https://github.com/xlx-creater/E-ENF (README, "Data"). Download the video sequences and the `ENF_Reference` folder (each `.wav` is one hour of grid voltage). @@ -89,7 +82,9 @@ Follow `eval/FACE_COMPOSITES.md`. Every person signs `eval/templates/consent_for ## H8 — Record and edit the ≤ 5-minute video — BLOCKED-HUMAN -Use `docs/VIDEO_SCRIPT.md`. Upload as public or unlisted. Put the link in `README.md` (line "Video:"). `scripts/final_check.py` checks the link exists; record the duration with `python scripts/check_video_duration.py `. +1. **Team clip needed.** Record a short clip of the team (consenting members only) and save it as `video/assets/team.mp4`. `video/scenes.yaml` uses this file; until it exists, `video/make_video.py` shows a placeholder card in the team scene. +2. Build and check the video per `docs/VIDEO_SCRIPT.md`. Any demo clip shown must be labelled SYNTHETIC where it comes from the simulator. +3. Upload as public or unlisted. Put the link in `README.md` (line "Video:") and in `docs/SUBMISSION.md` (Links). `scripts/final_check.py` checks the link exists; record the duration with `python scripts/check_video_duration.py `. ## H9 — Submit on Devpost — BLOCKED-HUMAN diff --git a/docs/JUDGE_GUIDE.md b/docs/JUDGE_GUIDE.md index 00e8bdd..9aa732f 100644 --- a/docs/JUDGE_GUIDE.md +++ b/docs/JUDGE_GUIDE.md @@ -2,9 +2,9 @@ GRIDPRINT checks if a video is real by reading the power-grid frequency from the flicker of indoor lights. The camera's rolling shutter records the flicker as faint horizontal bands. GRIDPRINT compares the measured frequency track with a reference log of the real grid. -Endpoint: +Endpoint: https://5u7suz00bi.execute-api.us-east-1.amazonaws.com -The public HTTPS URL is added on this line at deployment. +The endpoint is the live AWS deployment (`us-east-1`): Amazon API Gateway → internal Application Load Balancer → Fargate API, with jobs on Graviton4 ECS workers. The web app is served from the same address. **Live demonstration.** The team runs the full system with `make local` in a live screen-share on request. This runs the same engine, agent and web app as the AWS deployment, with local storage and the deterministic planner. @@ -15,6 +15,19 @@ The public HTTPS URL is added on this line at deployment. 3. Watch the job page. It shows progress, the live agent trace, the verdict card, the band overlay player with timeline markers, plots, and downloads (report PDF, report JSON, overlay MP4). 4. Log in as a reviewer to see the approval screen for `CONTRADICTED` results. +### How to verify a result on the live app + +1. Open a finished job page directly, for example + https://5u7suz00bi.execute-api.us-east-1.amazonaws.com/#/jobs/aws3-capture-verified-040158 + Other finished jobs: `#/jobs/aws3-dropped-frames-040218`, `#/jobs/aws3-cut-1s-040211`. +2. Check the verdict card (verdict, reasons, recording-time estimate), the plots, and the agent trace. Each trace step shows the planner, the tool, and the decision reason; steps where the code guard replaced the model's proposal start with "guard:". +3. Download the report PDF or JSON from the job page and compare it with the copy in the repository under `results/aws//` (`result.json`, `trace.json`, `report.pdf`). +4. The same job is also readable as JSON: `GET /v1/jobs/`. + +These demo jobs use **SYNTHETIC** test clips made by the rolling-shutter simulator (`eval/make_demo_inputs.py`), not real camera recordings. Measured results for them are in `docs/TECHNICAL_REPORT.md` §6, including one case (`cut-1s`) that missed its target verdict. + +If you upload an ordinary phone video, expect `INCONCLUSIVE` in most cases: phone camera apps usually turn on anti-banding, which removes the flicker bands (see section 5). `INCONCLUSIVE` does not mean the video is fake. + ## 2. Verdicts GRIDPRINT gives exactly three verdicts: diff --git a/docs/KEYBOARD_WALKTHROUGH.md b/docs/KEYBOARD_WALKTHROUGH.md new file mode 100644 index 0000000..33acf55 --- /dev/null +++ b/docs/KEYBOARD_WALKTHROUGH.md @@ -0,0 +1,55 @@ +# Keyboard-only walkthrough + +Date: 2026-10-27 +URL tested: https://5u7suz00bi.execute-api.us-east-1.amazonaws.com (live AWS deployment) +Pages tested: `#/` (home), `#/jobs/aws3-dropped-frames-040218` (finished job), plus Enter on a nav link to `#/limitations`. +Browser: Chromium-based browser pane, keys sent with Tab, Shift+Tab and Enter only. +Rules followed: no file was uploaded, no form was submitted, no demo case was run. + +## Home page steps + +1. Load `#/`. Focus starts on the page heading (H1, "Check if a video is real from the light in the room"). +2. Press Tab from the top of the page. Tab order observed: + 1. Skip to main content (hidden until focused, then shown top left) + 2. GRIDPRINT Verify (brand link) + 3. Home + 4. Reviewer + 5. Limitations + 6. Judge guide + 7. Use light theme (button) + 8. Read the limitations (link in the intro text) + 9. Video file (file input) + 10. Claimed grid zone (select) + 11. Claimed recording time (UTC) (datetime input) + 12. Claimed time tolerance (seconds) (number input) + 13. Capture sidecar file (file input) + 14. Upload and check (submit button, focused only) + 15. Live grid frequency: Grid zone (select) + 16. Eight demo-case Run buttons, in page order (focused only, never pressed) +3. Tab after the last Run button wraps back to Skip to main content. +4. Shift+Tab moves back through the same order. Shift+Tab from the skip link wraps to the last Run button. +5. Enter on Skip to main content moves focus to `
`. +6. Enter on the Limitations nav link opens `#/limitations`. Focus moves to the H1 "Limitations". The page title changes to "Limitations - GRIDPRINT Verify". + +## Job page steps + +1. Load `#/jobs/aws3-dropped-frames-040218`. Focus starts on the H1 "Job aws3-dropped-frames-040218". +2. Tab order observed: Refresh status (button), then it wraps to Skip to main content, the brand link, the nav links and Use light theme. +3. The verdict card, reasons, agent trace and downloads are static text. They are not tab stops. They are read in page order after the Progress section. +4. The page has headings for each section: Progress, Verdict, Agent trace, Downloads. +5. The status line has `role="status"`. The agent trace text sits in an `aria-live="polite"` region. + +## What worked + +- Every interactive control on the home page is reachable with Tab and Shift+Tab. +- There is a working skip link. +- Every focused element showed a visible focus ring: a solid outline, about 2.7 px, light blue (rgb 138, 180, 248), on the dark theme. +- Each demo Run button has a distinct accessible name, for example "Run demo case: Dropped frames with original timestamps (SYNTHETIC)". The visible text is only "Run". +- On route change, focus moves to the new page's H1 and the document title updates. +- Nav links open pages with Enter. + +## Problems found + +- On both finished AWS jobs (`aws3-capture-verified-040158` and `aws3-dropped-frames-040218`), the Agent trace section says "No agent steps were recorded." and the Downloads section says "No files are available yet." So there were no trace entries or download links to reach by keyboard. This is a content issue on the deployed jobs, not a keyboard issue, but it means the trace and downloads could not be tested. +- Not tested: the native file picker dialog, opening the select lists with arrow keys, and the Reviewer sign-in form (no token entered, no form submitted). +- Focus colours were checked only in the dark theme. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index f32991e..5e3d9f8 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -1,6 +1,6 @@ # GRIDPRINT progress -Current milestone: M2/M3 hardening (video integration tests) and M8 (AWS deployment in progress). +Current milestone: M8 (9 of 10 stacks deployed; Web/CloudFront BLOCKED-HUMAN H1), M11 (demo cases on the deployed endpoint), M2/M3 hardening. Status key: ACCEPTED (all criteria shown with evidence), OPEN (work remains), BLOCKED-HUMAN (waits for a task in `docs/HUMAN_TASKS.md`). @@ -50,13 +50,16 @@ Status key: ACCEPTED (all criteria shown with evidence), OPEN (work remains), BL - Done: MCP server (12 tools, stdio test), fallback planner (B1–B6), Bedrock planner, policies, trace; `agent/tests` (13 passed); adversarial-planner fuzz (200 runs) in `tests/test_stress.py`. - Remaining: saved traces from real runs showing B1–B6; the evaluation run commits them under `results/`. Bedrock planner: Amazon Nova Lite through a cross-account role (D-026); the fallback planner covers failed model calls. -## M8 — AWS deployment — OPEN +## M8 — AWS deployment — OPEN (Web/CloudFront: BLOCKED-HUMAN H1) - Account 643700104680, region `us-east-1`, profile `gridprint`, resource prefix `orchard` (D-021). -- Deployed: Network, Storage (KMS), Data, Ai, Auth, Compute (Graviton4 `c8g.xlarge` workers, max 1 per D-024; SQS with DLQ), Api (Fargate `linux/arm64` behind an internal ALB), Iot, Observability. +- Deployed (9 of 10 stacks): Network, Storage (KMS), Data, Ai, Auth, Compute (Graviton4 `c8g.xlarge` workers, max 1 per D-024; SQS with DLQ), Api (Fargate `linux/arm64` behind an internal ALB), Iot, Observability. +- Not deployed: Web (CloudFront waits for AWS account verification, H1). Public HTTPS instead through API Gateway → VPC link → internal ALB → Fargate API, with the web app on the same origin (D-025). +- Endpoint: https://5u7suz00bi.execute-api.us-east-1.amazonaws.com +- Planner: Amazon Nova Lite on Bedrock through a cross-account role (D-026), with the deterministic guard and fallback. - Images: `linux/arm64`, built on a Graviton EC2 build instance by `infra/build_images.py`. -- In progress: public HTTPS endpoint through API Gateway; end-to-end run on AWS. -- Blockers: CloudFront (Web stack) needs AWS account verification (H1); EC2 vCPU quota increase (H1). +- Evidence: end-to-end jobs on AWS in `results/aws//` and `results/aws/index.json` (collected by `scripts/collect_aws_runs.py`); table in `docs/TECHNICAL_REPORT.md` §6. +- Remaining blockers: CloudFront (H1 account verification); EC2 vCPU quota increase (H1). ## M9 — Real evaluation — BLOCKED-HUMAN (H5–H7) @@ -64,8 +67,28 @@ Status key: ACCEPTED (all criteria shown with evidence), OPEN (work remains), BL ## M10 — COOL benchmark — OPEN / BLOCKED-HUMAN (COOL subscription) +- Done: configurations A (x86 `c7i.2xlarge`) and B (Graviton4 `c8g.2xlarge`), stock OpenCV 5.0.0, five runs each, with cost, parity and per-instance evidence in `results/bench/2026-10-27/`; reported in `docs/TECHNICAL_REPORT.md` §7. COOL award not claimed. +- Remaining: configuration C (COOL) after the Marketplace subscription (H1 item 4); ENF-track parity on a clip with a usable signal. + ## M11 — Demo and UX — OPEN + +- Demo cases (SYNTHETIC simulator clips from `eval/make_demo_inputs.py`) run end to end on the deployed system. Cases with evidence in `results/aws/`: + - capture-verified: `VERIFIED` (FINAL), target `VERIFIED`, job `aws3-capture-verified-040158` + - cut-1s: `VERIFIED` (FINAL), target `CONTRADICTED`, job `aws3-cut-1s-040211` — MISSED target + - dropped-frames: `VERIFIED` (FINAL), target `VERIFIED`, job `aws3-dropped-frames-040218` + - agent-recovery: `INCONCLUSIVE` (FINAL), target `second-pass verdict`, job `aws4-agent-recovery-041816` + - capture-verified: `VERIFIED` (FINAL), target `VERIFIED`, job `aws4-capture-verified-041747` + - cut-1s: `VERIFIED` (FINAL), target `CONTRADICTED`, job `aws4-cut-1s-041731` — MISSED target + - daylight-only: `INCONCLUSIVE` (DRAFT), target `INCONCLUSIVE`, job `aws4-daylight-only-041808` + - dropped-frames: `VERIFIED` (FINAL), target `VERIFIED`, job `aws4-dropped-frames-041757` + - insertion: job failed on the worker (no result produced), target `CONTRADICTED`, job `aws4-insertion-041739` — MISSED target +- Open: AWS runs for the cases not listed above; investigate cases marked MISSED target (see `docs/TECHNICAL_REPORT.md` §6). + + ## M12 — Docs and video — OPEN (video: H8) +- Done: all Part 14 documents exist; consistency pass on 2026-10-27 (planner Amazon Nova Lite per D-026, benchmark in report §7, COOL not claimed). +- Remaining: video recording, upload and link (H8); README fresh-clone test result under `results/fresh_clone/`. + ## M13 — Final check — OPEN (`scripts/final_check.py` reports the open items) diff --git a/docs/REQUIREMENTS_TRACE.md b/docs/REQUIREMENTS_TRACE.md index 6e0d8fa..d6924ec 100644 --- a/docs/REQUIREMENTS_TRACE.md +++ b/docs/REQUIREMENTS_TRACE.md @@ -2,25 +2,25 @@ Every line needs an evidence link before the final stop. -Status values: `MET` (the evidence exists in the repository or on the account now), `PARTIAL` (the note says what is missing), `OPEN` (no evidence yet). +Status values: `MET` (the evidence exists in the repository or on the account now), `PARTIAL` (the note says what is missing), `NOT CLAIMED` (optional award item the submission does not claim; the evidence column links the statement), `OPEN` (no evidence yet). | Section | Requirement | Status | Evidence | |---|---|---|---| | 3.1 | OpenCV 5 performs substantive image/video analysis (Engine S1–S14) | MET | `engine/gridprint_engine/*.py` (stages S1–S15); OpenCV 5 usage map in `docs/TECHNICAL_REPORT.md` §5; video integration tests `engine/gridprint_engine/tests/test_video.py` | -| 3.1 | A meaningful component runs on AWS (Part 10.6) | PARTIAL | Deployed stacks (Network, Storage, Data, Ai, Auth, Compute, Api, Iot, Observability) from `infra/`; status table in `docs/TECHNICAL_REPORT.md` §6. Missing: a completed end-to-end job on AWS (in progress). | -| 3.2 | Technical report: problem, users, architecture, OpenCV 5 implementation, AWS deployment, evaluation, limitations, responsible use | PARTIAL | `docs/TECHNICAL_REPORT.md`. Missing: result tables in §7–§10 from the evaluation and benchmark runs. | +| 3.1 | A meaningful component runs on AWS (Part 10.6) | MET | Nine of ten stacks deployed from `infra/` (status table in `docs/TECHNICAL_REPORT.md` §6). End-to-end jobs ran on Graviton4 ECS workers with the Bedrock planner and the DynamoDB grid reference: `results/aws//` (`result.json`, `trace.json`, `report.html`, `report.pdf`, plots) and `results/aws/index.json`, collected by `scripts/collect_aws_runs.py`. Web stack (CloudFront) not deployed: H1. | +| 3.2 | Technical report: problem, users, architecture, OpenCV 5 implementation, AWS deployment, evaluation, limitations, responsible use | PARTIAL | `docs/TECHNICAL_REPORT.md`: AWS runs (§6), Graviton vs x86 benchmark (§7, `results/bench/2026-10-27/`), SYNTHETIC agent and pipeline evaluation with failure cases (§8–§10, `results/eval/`). Missing: real-world results (H5–H7). | | 3.2 | Judge-accessible code repository | MET | https://github.com/vivekyarra/Alibi (public) | | 3.2 | Pinned dependencies plus clear build, deployment and test instructions | MET | `uv.lock`, `pyproject.toml`, `web/package-lock.json`; `README.md` (quick start, deploy, evaluate); `Makefile`; `.github/workflows/ci.yml` | | 3.2 | Architecture diagram showing OpenCV 5, AWS, COOL and agent components | MET | `docs/diagrams/architecture.svg` (source `docs/diagrams/architecture.mmd`), `docs/diagrams/agent_workflow.svg`; COOL is shown as supported by the stack, not active (§3.3 lines). | -| 3.2 | Working web endpoint (Verify) or arranged live screen-share | OPEN | Public HTTPS endpoint pending (CloudFront needs AWS account verification; API Gateway endpoint in progress). Live screen-share with `make local` offered in `docs/JUDGE_GUIDE.md`. | +| 3.2 | Working web endpoint (Verify) or arranged live screen-share | MET | https://5u7suz00bi.execute-api.us-east-1.amazonaws.com (API Gateway → VPC link → internal ALB → Fargate API; web app on the same origin, D-025). Job pages for the AWS runs, e.g. `#/jobs/aws3-capture-verified-040158`; evidence `results/aws/`. Live screen-share with `make local` also offered in `docs/JUDGE_GUIDE.md`. | | 3.2 | Public or unlisted video, max 5 minutes | OPEN | Script `docs/VIDEO_SCRIPT.md`; recording is human task H8. | -| 3.2 | Evaluation evidence, including failure cases and limitations | PARTIAL | Limitations in `docs/TECHNICAL_REPORT.md` §11; simulator `eval/simulator/`; evaluation tools `eval/run_eval.py`, `eval/make_report.py`; first SYNTHETIC run folder `results/eval/2026-10-27/`. Missing: committed result tables and the failure gallery. | -| 3.3 | COOL executes the claimed core workload on AWS Graviton | OPEN | COOL not active: Marketplace subscription pending (H1). The engine runs stock OpenCV 5.0.0 on Graviton. The stack uses a COOL AMI when `aws.cool_ami_id` is set. | -| 3.3 | Report COOL version and AWS instance/deployment configuration | PARTIAL | AWS configuration: `docs/TECHNICAL_REPORT.md` §6, `config/default.yaml`, `infra/gridprint_infra/compute.py`. Missing: COOL version (needs the COOL AMI). | -| 3.3 | Reproducible evaluation method, inputs, baselines and results | PARTIAL | Method and inputs: `bench/README.md`, `bench/configs.yaml`, `bench/inputs.txt`, `bench/run_bench.py`, `bench/prices.py`; `eval/`. Missing: benchmark results under `results/bench/`. | -| 3.3 | Evidence that COOL executes the claimed workload | OPEN | Collector `bench/cool_evidence.py` with tests `bench/tests/test_cool_evidence.py`; no evidence file until the COOL benchmark runs. | +| 3.2 | Evaluation evidence, including failure cases and limitations | PARTIAL | Limitations in `docs/TECHNICAL_REPORT.md` §11; simulator `eval/simulator/`; evaluation tools `eval/run_eval.py`, `eval/make_report.py`; SYNTHETIC run folder `results/eval/2026-10-27/`; SYNTHETIC demo cases run on AWS in `results/aws/` with a table in `docs/TECHNICAL_REPORT.md` §6, including one failure (cut-1s missed, `results/aws/aws3-cut-1s-040211/`). Missing: committed result tables in §9–§10 and the failure gallery; real-world data (H5–H7). | +| 3.3 | COOL executes the claimed core workload on AWS Graviton | NOT CLAIMED | COOL award not claimed (`docs/TECHNICAL_REPORT.md` §7; SPEC 17.3 item 9 fallback). COOL not active: Marketplace subscription pending (H1, V5). The engine runs stock OpenCV 5.0.0 on Graviton. The stack uses a COOL AMI when `aws.cool_ami_id` is set. | +| 3.3 | Report COOL version and AWS instance/deployment configuration | PARTIAL | AWS configuration: `docs/TECHNICAL_REPORT.md` §6, `config/default.yaml`, `infra/gridprint_infra/compute.py`. Benchmark instances and builds: `results/bench/2026-10-27/evidence/`. Missing: COOL version (COOL not active, award not claimed). | +| 3.3 | Reproducible evaluation method, inputs, baselines and results | PARTIAL | Method and inputs: `bench/README.md`, `bench/configs.yaml`, `bench/inputs.txt`, `bench/run_bench.py`, `bench/prices.py`; `eval/`. Results: `results/bench/2026-10-27/` (A x86 and B Graviton4, five runs each, cost and parity), reported in `docs/TECHNICAL_REPORT.md` §7. Missing: configuration C (COOL). | +| 3.3 | Evidence that COOL executes the claimed workload | NOT CLAIMED | COOL award not claimed (`docs/TECHNICAL_REPORT.md` §7). Collector `bench/cool_evidence.py` (tests `bench/tests/test_cool_evidence.py`) captured the stock-build evidence for A and B in `results/bench/2026-10-27/evidence/`; it captures COOL evidence the same way once configuration C runs. | | 3.3 | Explain any x86/Arm coexistence | MET | `docs/ARCHITECTURE.md` §7; `docs/TECHNICAL_REPORT.md` §6; `infra/build_images.py` (`linux/arm64` images, `--amd64` for benchmark baseline A only) | | 3.4 | Multi-step perception → decision → action loop where OpenCV 5 results change a later plan, tool call, action or human-approval request | MET | `agent/orchestrator.py`, `agent/fallback_planner.py`, `agent/planner_bedrock.py`, `agent/policies.py`, `mcp_server/tools.py`, `mcp_server/server.py`; tests `agent/tests/test_agent.py` (B1–B6), `mcp_server/tests/test_mcp_stdio.py` | | 3.4 | Agent workflow diagram (perception, decision/orchestration, action) | MET | `docs/diagrams/agent_workflow.svg` (source `docs/diagrams/agent_workflow.mmd`) | -| 3.4 | Trace or demonstration showing OpenCV 5 output changing a later decision | PARTIAL | Tested in `agent/tests/test_agent.py` (`test_b1_weak_signal_reselects_patches_and_reextracts` and others); trace writer `agent/trace.py`. Missing: saved traces from real runs under `results/` (the evaluation run commits them). | +| 3.4 | Trace or demonstration showing OpenCV 5 output changing a later decision | PARTIAL | Saved AWS traces `results/aws/*/trace.json`: Bedrock (Nova Lite) planner steps, code-enforced guard substitutions (`decision_reason` "guard: …"), and the cut-1s run where the probe found no sidecar and blind readout estimation (`READOUT_ESTIMATED`, B2) fed the verdict. Tested re-planning from OpenCV output in `agent/tests/test_agent.py` (`test_b1_weak_signal_reselects_patches_and_reextracts` and others). Missing: a saved trace where a measured OpenCV result (e.g. `SIGNAL_WEAK`) changes the plan (agent-recovery case). | | 3.4 | Evaluation of task success, failure handling, observability and human control | PARTIAL | Metrics code `eval/metrics.py`; human control tests `agent/tests/test_agent.py` (`test_b6_contradicted_requests_review_and_no_final_report`); planner fuzz `tests/test_stress.py`; CloudWatch dashboard and alarms in `infra/gridprint_infra/observability.py`. Missing: measured results under `results/`. | diff --git a/docs/SUBMISSION.md b/docs/SUBMISSION.md new file mode 100644 index 0000000..7af9753 --- /dev/null +++ b/docs/SUBMISSION.md @@ -0,0 +1,82 @@ +# Devpost submission — GRIDPRINT + +Copy each section into the matching Devpost field. + +## Project name +GRIDPRINT + +## Tagline +Checks whether a video is real by reading the power grid from the flicker of the lights in the room. + +## Inspiration +AI tools make fake video cheap. The side effect is worse: people now dismiss real video as "AI". Newsrooms, courts, +insurers and human-rights documenters receive footage they cannot easily defend. Detectors that judge pixels guess, +and metadata is lost on the first re-upload. We wanted a physical signal that stays inside the pixels. + +## What it does +Mains-powered lights flicker at twice the grid frequency. A phone camera's rolling shutter reads one sensor row at a +time, so the flicker becomes faint bands. GRIDPRINT measures those bands with OpenCV 5, rebuilds the grid-frequency +track (electric network frequency, ENF), and matches it to reference logs of the real grid. It reports when the video +was recorded, whether parts were cut, inserted or reordered, and which grid zone it matches — never a finer location. + +There are exactly three verdicts. VERIFIED and INCONCLUSIVE are final at once. CONTRADICTED needs a human reviewer's +approval before the report is final. A missing signal is never evidence that a video is fake. + +## How we built it +- **OpenCV 5 engine (15 stages):** linear-light conversion with LUTs; motion and static-scene masks with + goodFeaturesToTrack, calcOpticalFlowPyrLK, findHomography (USAC_MAGSAC) and DISOpticalFlow; person masks with the + dnn module; per-frame flicker phase with cv2.solve; a cross-check with cv2.dft on a gap-masked time grid; + continuity checks with two-sided phase fits; FaceDetectorYN for an experimental face-region check; band overlay + video and an accessible HTML/PDF report. +- **Agent:** an MCP server exposes twelve engine tools. A planner on Amazon Bedrock (Amazon Nova Lite through a + cross-account role) chooses the next tool from OpenCV measurements — for example re-selecting light patches after + a weak signal. Code-enforced policies keep the verdict deterministic, cap the budget, and block a FINAL report for + CONTRADICTED until a human approves. A deterministic planner covers any failed model step. Every step is traced. +- **AWS:** CDK v2 stacks — Graviton4 (c8g) ECS workers built for linux/arm64, Fargate arm64 API, API Gateway + endpoint, SQS, DynamoDB, S3 with KMS, Cognito reviewer group, IoT Core ingest for the grid reference Node, + CloudWatch dashboards and alarms. +- **Capture app (Android, Camera2):** auto-exposure and anti-banding off, short exposure, per-frame sensor + timestamps and readout skew in a signed sidecar. +- **Grid reference Node (ESP32 + GPS PPS):** design, firmware and ingest; safety-first (certified AC adapter only). +- **Evaluation:** a rolling-shutter simulator with ground truth (results labelled SYNTHETIC), threshold calibration + against a written false-CONTRADICTED target, fuzz and stress tests. + +## Challenges we ran into +- The wrong readout direction produces a convincing but false frequency track; we rank candidates by physical + plausibility. +- Chained frame-to-frame homographies drifted on a fixed camera and smeared the scene; registering each frame directly + to a reference frame fixed it. +- A cut whose length is a whole number of flicker periods changes the phase only by the grid deviation; two-sided + phase fits made those small jumps measurable. +- New-account AWS limits (vCPU quota, CloudFront verification) shaped the deployment. + +## Accomplishments that we're proud of +- An honest product: three verdicts, mandatory human review for CONTRADICTED, and no claim beyond the evidence. +- The agent changes its plan from OpenCV measurements, and policies keep it safe even when the model errs. +- The same engine runs on Graviton4 and x86 with stock OpenCV 5; in our benchmark Graviton4 gave higher throughput + and a lower cost per hour of video (technical report §7). + +## What we learned +Physics-based provenance is strong but narrow: it needs mains lighting and a camera that does not hide the flicker. +Saying so plainly is part of the product. + +## What's next +Grid reference Nodes in more zones, real-world evaluation with consenting participants, the Capture app on more +phones, and COOL-accelerated workers once the Marketplace subscription is active. + +## Built with +opencv, python, numpy, pyav, ffmpeg, fastapi, react, typescript, vite, aws, amazon-bedrock, amazon-ecs, +aws-graviton, aws-fargate, amazon-api-gateway, amazon-sqs, amazon-dynamodb, amazon-s3, amazon-cognito, +aws-iot-core, aws-lambda, amazon-cloudwatch, aws-cdk, model-context-protocol, kotlin, android, esp32 + +## Links +- Code: https://github.com/vivekyarra/Alibi +- Live endpoint: https://5u7suz00bi.execute-api.us-east-1.amazonaws.com (how to check a result: docs/JUDGE_GUIDE.md; demo clips are SYNTHETIC) +- Technical report: docs/TECHNICAL_REPORT.md +- Video: the link is added at submission (at most 5 minutes) + +## Special awards +- **Agentic Vision Award:** opt in. Evidence: agent/, mcp_server/, agent traces under results/, agent tests. +- **Best Use of COOL Award:** not claimed; do not opt in. COOL is not active (Marketplace subscription pending). + results/bench/2026-10-27/ holds the stock OpenCV 5 benchmark of Graviton4 c8g.2xlarge against x86 c7i.2xlarge + (technical report §7); it is not a COOL result. diff --git a/docs/TECHNICAL_REPORT.md b/docs/TECHNICAL_REPORT.md index 29d218f..f4d7b8d 100644 --- a/docs/TECHNICAL_REPORT.md +++ b/docs/TECHNICAL_REPORT.md @@ -2,7 +2,7 @@ GRIDPRINT checks if a video is real from the flicker of the lights in the room. It reads the power-grid frequency from rolling-shutter flicker bands with OpenCV 5 and compares it with a reference log of the real grid. -Status (2026-10-27): sections 1–6 and 11–14 describe the built system. Sections 7–10 receive their tables from `eval/make_report.py` and the benchmark run. This report contains no measured number without a source tag (SPEC Part 14.3). +Status (2026-10-27): sections 1–6 and 11–14 describe the built system. Sections 7–10 report measured results from `results/`: the Graviton vs x86 benchmark (§7) and the SYNTHETIC agent and pipeline evaluation (§8–§10); §6 has the AWS runs. Real-world results wait for the real dataset (H5). This report contains no measured number without a source tag (SPEC Part 14.3). ## Contents @@ -62,7 +62,7 @@ Summary: - **Clients:** GRIDPRINT Capture (Android) and GRIDPRINT Verify (web). - **API:** FastAPI on ECS Fargate `linux/arm64`. Presigned S3 uploads. Jobs go to an SQS queue. - **Engine workers:** ECS on Graviton4 `c8g`, `linux/arm64`, OpenCV 5 (stock wheel). The stack also supports a COOL AMI when `aws.cool_ami_id` is set; COOL is not active yet (§6). Each worker task holds the agent orchestrator, the MCP client, and the MCP server `gridprint-engine` (stdio). -- **Planner:** an LLM on Amazon Bedrock through the Converse API with tool use (`agent/planner_bedrock.py`; Amazon Nova Lite through a cross-account role, D-026; the model ID is configuration, so a Claude model works unchanged), with the deterministic fallback planner taking over for any step where the model call fails; the fallback planner can also run alone (`agent/fallback_planner.py`). The Bedrock planner is implemented and tested against a recorded-shape client. Bedrock access on the account waits for AWS account verification, so all runs so far use the fallback planner (D-021). +- **Planner:** an LLM on Amazon Bedrock through the Converse API with tool use (`agent/planner_bedrock.py`; Amazon Nova Lite through a cross-account role, D-026; the model ID is configuration, so a Claude model works unchanged), with the deterministic fallback planner taking over for any step where the model call fails; the fallback planner can also run alone (`agent/fallback_planner.py`). The AWS runs in §6 use the Bedrock planner (Amazon Nova Lite); the SYNTHETIC evaluation suite in §8–§9 uses the fallback planner. - **Engine:** Python package `engine/gridprint_engine`, stages S1–S15. No AWS imports. Storage, grid log, and job store are reached through adapter interfaces. - **Reference:** GRIDPRINT Node (ESP32, GPS PPS, certified plug-in AC-to-AC adapter) → AWS IoT Core → Lambda → DynamoDB `GridLog`. - **Human control:** Cognito reviewer login; reviewer decisions stored in DynamoDB `Reviews`. @@ -140,49 +140,100 @@ Region: `us-east-1` (DECISIONS D-005). `make deploy` creates all stacks; `make d ### Deployment status (2026-10-27) -Account 643700104680, region `us-east-1`, resource prefix `orchard` (D-021). +Account 643700104680, region `us-east-1`, resource prefix `orchard` (D-021). Nine of ten stacks are deployed. + +Public endpoint: https://5u7suz00bi.execute-api.us-east-1.amazonaws.com (API Gateway → VPC link → internal ALB → Fargate arm64 API; web app on the same origin). | Stack | Status | Note | |---|---|---| | Network | Deployed | | | Storage | Deployed | S3 buckets with SSE-KMS | | Data | Deployed | DynamoDB `Jobs`, `Reviews`, `GridLog`, `TraceIndex` | -| AI | Deployed | IAM permission for the pinned Bedrock model. Bedrock model access waits for AWS account verification (H1); runs use the fallback planner. | +| AI | Deployed | Planner model Amazon Nova Lite on Amazon Bedrock through a cross-account role (D-026); the deterministic guard and fallback planner cover rejected or failed model steps. | | Auth | Deployed | Cognito user pool with `reviewer` group | | Compute | Deployed | ECS cluster; Graviton4 `c8g.xlarge` worker Auto Scaling group, at most one instance within the account vCPU quota (D-024); SQS queue and DLQ | -| API | Deployed | Fargate `linux/arm64` behind an internal ALB. A public HTTPS endpoint through Amazon API Gateway is in progress. | +| API | Deployed | Fargate `linux/arm64` behind an internal ALB. Public HTTPS through Amazon API Gateway (HTTP API) and a VPC link to the ALB (D-025). The web app is served from the same origin. | | IoT | Deployed | IoT topic rule and ingest Lambda | | Observability | Deployed | CloudWatch dashboard and alarms | -| Web | Not deployed | CloudFront requires AWS account verification (H1). | +| Web | Not deployed | CloudFront requires AWS account verification (H1). The web app is served by the API service instead. | Images: `linux/arm64`, built on a Graviton EC2 build instance by `infra/build_images.py` and pushed to Amazon ECR. They run on Graviton. -COOL: not active. The Marketplace subscription is pending (H1). The engine runs stock OpenCV 5.0.0 on Graviton. The COOL award is not claimed unless the benchmark in §7 runs. +COOL: not active, and the COOL award is not claimed. The Marketplace subscription is pending (H1). The engine runs stock OpenCV 5.0.0 on Graviton; §7 reports the Graviton vs x86 benchmark. + +### End-to-end runs on AWS + +Each run below is a demo case run on the deployed system. The job ran on a Graviton4 `c8g.xlarge` ECS worker, with the planner on Amazon Bedrock (Amazon Nova Lite) and the grid reference read from DynamoDB. The input clips are **SYNTHETIC**: rolling-shutter simulator clips from `eval/make_demo_inputs.py`, all with true recording start 2026-01-20T10:00:00Z. They are not real camera recordings. + +Evidence per job: `results/aws//` (`result.json`, `trace.json`, `report.html`, `report.pdf`, plots). The table is generated from `results/aws/index.json` (written by `scripts/collect_aws_runs.py`). "Error" is the recording-time estimate minus the true start. "Total stage time" is the sum of `stage_timings_s`. + + +| Job | Demo case | Target verdict | Measured verdict | Lifecycle | Reasons | Recording-time estimate (true start 2026-01-20T10:00:00Z) | Band SNR | Total stage time | Source | +|---|---|---|---|---|---|---|---|---|---| +| `aws3-capture-verified-040158` | capture-verified (SYNTHETIC) | `VERIFIED` | `VERIFIED` | `FINAL` | `READOUT_FROM_SIDECAR`, `MATCH_OK` | 2026-01-20T10:00:00.020533+00:00, error +0.021 s | 11.32 dB | 53.7 s | | +| `aws3-cut-1s-040211` | cut-1s (SYNTHETIC) | `CONTRADICTED` | `VERIFIED` | `FINAL` | `READOUT_ESTIMATED`, `MATCH_OK`, `CLAIM_TIME_MATCH` | 2026-01-20T10:00:00.469923+00:00, error +0.470 s | 11.37 dB | 60.5 s | | +| `aws3-dropped-frames-040218` | dropped-frames (SYNTHETIC) | `VERIFIED` (`DROPPED_FRAMES_EXPLAINED`) | `VERIFIED` | `FINAL` | `READOUT_FROM_SIDECAR`, `MATCH_OK`, `DROPPED_FRAMES_EXPLAINED` | 2026-01-20T10:00:00.014252+00:00, error +0.014 s | 11.43 dB | 52.1 s | | +| `aws4-agent-recovery-041816` | agent-recovery (SYNTHETIC) | second-pass verdict after re-planning | `INCONCLUSIVE` | `FINAL` | `READOUT_ESTIMATED`, `NO_REFERENCE_COVERAGE` | none | 7.54 dB | 56.6 s | | +| `aws4-capture-verified-041747` | capture-verified (SYNTHETIC) | `VERIFIED` | `VERIFIED` | `FINAL` | `READOUT_FROM_SIDECAR`, `MATCH_OK` | 2026-01-20T09:59:59.973488+00:00, error -0.027 s | 6.61 dB | 52.5 s | | +| `aws4-cut-1s-041731` | cut-1s (SYNTHETIC) | `CONTRADICTED` | `VERIFIED` | `FINAL` | `READOUT_ESTIMATED`, `MATCH_OK`, `CLAIM_TIME_MATCH` | 2026-01-20T10:00:00.471766+00:00, error +0.472 s | 11.38 dB | 46.3 s | | +| `aws4-daylight-only-041808` | daylight-only (SYNTHETIC) | `INCONCLUSIVE` | `INCONCLUSIVE` | `DRAFT` | `SIGNAL_ABSENT`, `READOUT_ESTIMATED`, `HIGH_COMPRESSION`, `USER_INPUT_REQUESTED` | none | -11.00 dB | 15.2 s | | +| `aws4-dropped-frames-041757` | dropped-frames (SYNTHETIC) | `VERIFIED` (`DROPPED_FRAMES_EXPLAINED`) | `VERIFIED` | `FINAL` | `READOUT_ESTIMATED`, `MATCH_OK` | 2026-01-20T10:00:00.109978+00:00, error +0.110 s | 8.07 dB | 42.8 s | | +| `aws4-insertion-041739` | insertion (SYNTHETIC) | `CONTRADICTED` | `job failed (no result)` | `None` | | none | n/a | 0.0 s | | + + +Findings from these runs: +- The capture-verified and dropped-frames cases gave their target verdicts on AWS. +- The `cut-1s` case did **not** give its target verdict. The continuity check (`check_continuity`) found no edit event, so the job ended `VERIFIED`. This is a missed edit on a SYNTHETIC clip; it is listed as a failure case. The report does not claim edit detection on AWS from these runs. +- Cases without a row (insertion, daylight-only, agent-recovery) have no AWS run evidence yet. -End-to-end runs on AWS are in progress. +Agent trace evidence (`results/aws/*/trace.json`): every step has `planner: "bedrock"` and `model_id: "us.amazon.nova-lite-v1:0"`. In each run the code-enforced guard rejected the model's proposal and substituted a rule step twice. The `decision_reason` reads "guard: planner proposed extract_flicker … (frequency or axis override before the first extraction); fallback rule: …" (steps 4 and 5). The model had tried to override the nominal frequency or readout axis before the first flicker extraction; the guard ran the deterministic rules (rank light patches, then a first extraction on all eligible patches). The last step is forced by the policy "report must be rendered". Behaviour B2 (readout unknown, so blind estimation) appears in the `cut-1s` run: `estimate_readout` returned `READOUT_ESTIMATED` and the verdict carries that reason. B1 and B3–B6 did not trigger in these runs (no weak signal, no high motion, no `CONTRADICTED` verdict). They are shown by the agent tests (`agent/tests/test_agent.py`). -x86 and Arm: production containers are `linux/arm64`. The `linux/amd64` image exists only for the x86 baseline in the COOL benchmark. +x86 and Arm: production containers are `linux/arm64`. The `linux/amd64` image exists only for the x86 baseline (configuration A) of the benchmark in §7. -Deployment status, instance configuration, and the endpoint URL are added after milestone M8. ## 7. COOL benchmark -Protocol (SPEC Part 12): same engine code and pinned inputs (`bench/inputs.txt`), three configurations of equal vCPU and memory: -- **A:** x86 instance, stock OpenCV 5 (`linux/amd64` image). -- **B:** Graviton `c8g`, stock OpenCV 5 (`linux/arm64` image). -- **C:** Graviton `c8g`, OpenCV 5 with COOL. +**COOL award not claimed.** Configuration C (Graviton with COOL) needs the COOL AMI from AWS Marketplace, and that subscription is still pending (H1, V5). Configurations A and B ran on 2026-10-27: the same engine on x86 and on Graviton4, both with stock OpenCV 5.0.0. They show what the move to Graviton gives before any COOL acceleration. + +Protocol (SPEC Part 12): same engine code and pinned inputs (`bench/inputs.txt`), configurations of equal vCPU and memory: +- **A:** x86 `c7i.2xlarge`, stock OpenCV 5 (`linux/amd64` image). +- **B:** Graviton4 `c8g.2xlarge`, stock OpenCV 5 (`linux/arm64` image). +- **C:** Graviton `c8g`, OpenCV 5 with COOL. Not run (see above). + +Metrics: throughput (video-seconds per wall-second), per-stage latency p50/p95, CPU utilization, memory, cost per hour of video (on-demand price from the AWS Price List API divided by throughput). Five runs per configuration, mean and standard deviation. Parity check of ENF tracks and verdicts across configurations. Evidence per instance: instance identity, `cv2.getBuildInformation()`, loaded library paths, versions, `lscpu`, `pip freeze`. + +Input: one pinned real clip, the public Creative Commons (CC BY-SA) clip "Fluorescent beat effect" from Wikimedia Commons (license in `docs/LICENSES.md`), with an empty grid log. These are speed and cost measurements only; they say nothing about verification accuracy. + +### Results A vs B (stock OpenCV 5.0.0, `results/bench/2026-10-27/`) + +| Metric | A: x86 `c7i.2xlarge` | B: Graviton4 `c8g.2xlarge` | +|---|---|---| +| Throughput, video-s per wall-s (mean ± std, 5 runs) | 0.916 ± 0.003 | 1.201 ± 0.002 | +| On-demand price, `us-east-1` | $0.357 per hour | $0.31904 per hour | +| Cost per video-hour | $0.390 | $0.266 | +| Mean CPU utilization (fraction of all vCPUs) | 0.180 | 0.174 | +| Peak memory (RSS) | 1999.9 MB | 1957.8 MB | +| Verdict, all runs | `INCONCLUSIVE` (5 of 5) | `INCONCLUSIVE` (5 of 5) | + +Stage latency p50 in seconds (S5 and S12 take about 0.0001 s on both and are left out): + +| Stage | A: x86 `c7i.2xlarge` | B: Graviton4 `c8g.2xlarge` | +|---|---|---| +| S1 ingest | 0.961 | 1.038 | +| S2 linear light | 5.123 | 4.242 | +| S3 readout | 4.002 | 3.324 | +| S4 motion | 2.385 | 1.646 | +| S6 patches | 1.964 | 1.143 | +| S7 row signal | 0.752 | 0.410 | +| S8 phase | 1.614 | 0.978 | -Metrics: throughput (video-seconds per wall-second), per-stage latency p50/p95, CPU utilization, memory, cost per hour of video (on-demand price from the AWS Price List API divided by throughput). At least five runs per configuration, mean and standard deviation. Parity check of ENF tracks and verdicts across A, B, C. Evidence that COOL executes: build information, loaded library paths, version string, profiler capture. +p95 values are in the same files. On this workload Graviton4 B processes more video per second than x86 A and costs less per hour of video, with stock OpenCV on both. Of the stages in the table, all except S1 (decoding with PyAV) are faster on B. -Results: the tables for this section are generated by `eval/make_report.py` from `results/bench//`. No result is written by hand. +**Parity.** Verdicts are identical on A and B. The ENF tracks are not within the 0.001 Hz tolerance (largest difference 0.568 Hz). This clip carries no usable grid signal, so its extracted tracks are noise, and small numeric differences between the x86 and Arm builds give different noise. Track parity can only be judged on a clip with a usable signal; that run is open, together with configuration C. -- COOL version and instance configuration: (generated) -- Throughput and latency table: (generated) -- Cost table: (generated) -- Parity report: (generated) -- Stages that COOL accelerates and stages it does not: (generated from the profile) +Evidence that each run used the stated instance and build: `results/bench/2026-10-27/evidence/A/` and `evidence/B/` (`instance_identity.json`, `build_information.txt`, `loaded_libraries.txt`, `versions.json`, `lscpu.txt`, `pip_freeze.txt`). Per-run records: `A/runs.json`, `B/runs.json`; logs: `logs/`; prices: `prices.json` (AWS Price List API). -If COOL cannot be obtained (V5), this section states that the COOL award is not claimed and reports A vs B only. +Tooling in `bench/`: `run_bench.py` (runner), `configs.yaml` (configurations A, B, C), `inputs.txt` (pinned inputs), `make_inputs.py`, `prices.py` (AWS Price List API), `cool_evidence.py` (build info, loaded libraries, version capture), and `run_remote.md` (how to run it on EC2). Output goes to `results/bench//`. When the COOL subscription is active, configuration C runs with the same command and adds its row to these tables. ## 8. Agent design and evaluation @@ -191,7 +242,7 @@ If COOL cannot be obtained (V5), this section states that the COOL award is not The runtime agent plans and adapts the analysis of each job. It is the agentic workflow of GRIDPRINT. The AI coding assistant that wrote code is not part of it. - **Perception:** OpenCV 5 stage outputs returned by MCP tools: band SNR, readout confidence, motion level, patch ranking, match statistics, continuity events. -- **Decision:** a planner chooses the next tool call. Two planners use the same tools: Claude on Amazon Bedrock (`planner_bedrock.py`) and a deterministic fallback (`fallback_planner.py`). Policies in `policies.py` enforce budgets and order rules in code. +- **Decision:** a planner chooses the next tool call. Two planners use the same tools: an LLM planner on Amazon Bedrock through the Converse API with tool use (`planner_bedrock.py`; Amazon Nova Lite `us.amazon.nova-lite-v1:0` through a cross-account role, D-026; the model ID is configuration) and a deterministic fallback (`fallback_planner.py`). Policies in `policies.py` enforce budgets and order rules in code. - **Action:** MCP tool calls to the `gridprint-engine` server, `request_user_input`, `request_human_review`, `render_report`. Required adaptive behaviors (SPEC Part 9.3): @@ -209,19 +260,121 @@ The agent cannot write or change a verdict, thresholds, or reason codes. Every s ### Evaluation -Metrics (SPEC Part 9.7) for both planners: task success, recovery rate, tool calls per job, unnecessary-call rate, human-review precision, budget-exhaustion rate. +Metrics (SPEC Part 9.7): task success, recovery rate, tool calls per job, unnecessary-call rate, human-review precision, budget-exhaustion rate. + +**Planner coverage.** The evaluation suite below ran with the deterministic **fallback planner** only. The Bedrock planner was not run on the evaluation suite, so there are no Bedrock-planner metrics in this section. (The AWS demo runs in §6 used the Bedrock planner on the SYNTHETIC demo clips; they are not part of this evaluation.) -Results: the tables for this section are generated by `eval/make_report.py` into `results/eval//`. Example traces for B1–B6 are stored under `results/`. +All values are **SYNTHETIC** (simulator clips, `synthetic-v1` suite, test split, 22 clips, frozen thresholds). They are not real-world accuracy. + +| Agent metric (SYNTHETIC, fallback planner, test split) | Value [Wilson CI, 95 percent] | +|---|---| +| Task success (final verdict = expected verdict) | 68.2% [47.3–83.6] (k=15, n=22) | +| Recovery rate (first extraction weak, a later extraction usable) | 33.3% [6.1–79.2] (k=1, n=3) | +| Unnecessary-call rate (repeated identical calls + tool errors) | 0.0% [0.0–1.7] (k=0, n=221) | +| Human-review precision (`CONTRADICTED` jobs that were edited clips) | 100.0% [34.2–100.0] (k=2, n=2) | +| Budget-exhaustion rate | 0.0% [0.0–14.9] (k=0, n=22) | + +Tool calls per job: mean 10.05, median 10.0, max 13.0 (n=22). +`request_user_input` requests: one `original_file` request (B4). + +Task success is mostly an engine result: the fallback planner follows fixed rules, so a wrong verdict usually comes from the signal or the thresholds, not the plan (see §10). + +**Example traces.** Six full traces are copied unchanged from the evaluation runs to `results/agent_traces/`: + +| Trace | Behaviour shown | What happens | +|---|---|---| +| [`short_readout_long_expo__s1031.json`](../results/agent_traces/short_readout_long_expo__s1031.json) | B1 with recovery | The first extraction is weak. The agent re-ranks patches and extracts again on the top patches. The second track is usable, so matching continues. (This job then ended in a wrong-time `VERIFIED`; see §10.) | +| [`weak_flicker__s1021.json`](../results/agent_traces/weak_flicker__s1021.json) | B1 → B5 | Re-rank patches, re-extract, switch nominal frequency, switch sensor axis; no usable signal, so `compute_verdict` gives `INCONCLUSIVE`. | +| [`messaging_compression__s1100.json`](../results/agent_traces/messaging_compression__s1100.json) (calibration split) | B4, B1, B5 | Strong compression and a weak signal: `request_user_input(kind=original_file)`, then the B1 alternatives, then B5. | +| [`no_mains_light__s1141.json`](../results/agent_traces/no_mains_light__s1141.json) | B4, B1, B5 | No mains-powered light: the same path ends `INCONCLUSIVE`. The missing signal is not treated as evidence of a fake. | +| [`reorder__s1201.json`](../results/agent_traces/reorder__s1201.json) | B6 | Verdict `CONTRADICTED` → `request_human_review` → `render_report(final=false)` (pending review). | +| [`clean__s1001.json`](../results/agent_traces/clean__s1001.json) | none (baseline) | Strong signal: the plain path probe → readout → motion → patches → extract → match → continuity → face check → verdict → final report. | + +Behaviours **B2** (readout unknown or low-confidence blind estimate → ask for camera model) and **B3** (`HIGH_MOTION` → strict motion analysis) did not trigger on any of the 44 suite clips, so no suite trace shows them. In the camera-motion clips the motion stage did not report high motion. B2 and B3 are covered only by the agent tests (`agent/tests/`). ## 9. Evaluation -Real and synthetic results are reported in separate tables. Synthetic results are labeled `SYNTHETIC` and are never presented as real-world accuracy. +Real and synthetic results are reported in separate tables. Synthetic results are labeled `SYNTHETIC` and are never presented as real-world accuracy (SPEC 11.1). ### Synthetic evaluation -Simulator: `eval/simulator/`. It makes rolling-shutter videos with known ground truth (ENF track, flicker depth, readout time, exposure, timing jitter, dropped frames, motion, noise, compression, cuts and insertions). +Simulator: `eval/simulator/`. It makes rolling-shutter videos with known ground truth (ENF track, flicker depth, readout time, exposure, timing jitter, dropped frames, motion, noise, compression, cuts and insertions). Suite `synthetic-v1` (`data/synthetic/v1/manifest.json`): 44 clips, 22 per split, one clip per condition per split. Each split has 16 authentic mains-lit clips, 1 authentic clip without mains light, and 5 edited clips. Every clip goes through the full agent (fallback planner) and engine. + +**All numbers in this section are SYNTHETIC. They measure the pipeline against simulator ground truth, not real-world accuracy.** + +Protocol (SPEC 11.4), followed in this order: +1. Calibration split run with the placeholder thresholds → `results/eval/2026-10-27/synthetic-v1-fallback/`. +2. `eval/calibrate_thresholds.py` grid search on the calibration split (target false-`CONTRADICTED` rate from `config/default.yaml`, no wrong-time `VERIFIED`). It wrote `config/thresholds.yaml` with provenance status `PROVISIONAL` (synthetic data only; must be recalibrated on the real dataset). +3. Test split run **once** with the frozen thresholds → `results/eval/2026-10-27-test/synthetic-v1-fallback/` (`run_meta.json` records the thresholds hash). + +#### Test split (SYNTHETIC, frozen thresholds, fallback planner) + +Full summary: [`summary.md`](../results/eval/2026-10-27-test/synthetic-v1-fallback/summary.md); per-clip table: [`clips.csv`](../results/eval/2026-10-27-test/synthetic-v1-fallback/clips.csv). + +| Metric (SYNTHETIC) | Value [Wilson CI, 95 percent] | +|---|---| +| False-`CONTRADICTED` rate on authentic clips | 0.0% [0.0–18.4] (k=0, n=17) | +| `VERIFIED` coverage, mains-lit clips | 75.0% [50.5–89.8] (k=12, n=16) | +| Edit detection rate | 20.0% [3.6–62.4] (k=1, n=5) | +| Dropped-frame false alarms | 0.0% [0.0–79.3] (k=0, n=1) | +| Agent task success (verdict = expected) | 68.2% [47.3–83.6] (k=15, n=22) | +| Agent recovery rate (weak first extraction later usable) | 33.3% [6.1–79.2] (k=1, n=3) | +| Unnecessary-call rate | 0.0% [0.0–1.7] (k=0, n=221) | +| Human-review precision | 100.0% [34.2–100.0] (k=2, n=2) | +| Budget-exhaustion rate | 0.0% [0.0–14.9] (k=0, n=22) | + +| class (SYNTHETIC) | VERIFIED | CONTRADICTED | INCONCLUSIVE | no result | +|---|---|---|---|---| +| authentic-with-mains-light | 12 | 0 | 4 | 0 | +| authentic-without-mains-light | 0 | 0 | 1 | 0 | +| edited | 2 | 2 | 1 | 0 | + +Rows are ground-truth classes; columns are verdicts. The suite has no `synthetic` (generated-video) class. + +- Time error of `VERIFIED` clips: median 0.157 s, max 1342.182 s (n=14). +- ENF track RMSE against ground truth: median 2.046 mHz, p95 202.644 mHz (n=16). +- Edit localization error: one localized edit, error 1478.067 s (n=1); see §10. +- Runtime per job is dominated by motion analysis (S4, mean 114.32 s) and overlay rendering (S14, mean 128.92 s), measured on the development PC with four clips in parallel. +- Pipeline errors: none. -Results: generated by `eval/make_report.py` into `results/`. (Tables are inserted here from those files.) +**Edit-detection metric caveat.** The edit detection rate counts only edited clips whose ground truth lists an edit time. The `reorder` clip has no edit time in its ground truth, so its correct `CONTRADICTED` is not counted there. The `edited` row of the confusion matrix is the complete count. + +#### Calibration split (SYNTHETIC, placeholder thresholds) + +Full summary: [`summary.md`](../results/eval/2026-10-27/synthetic-v1-fallback/summary.md). These verdicts were produced with the hand-written placeholder thresholds **before** calibration, so they are not the operating point: + +| Metric (SYNTHETIC) | Value [Wilson CI, 95 percent] | +|---|---| +| False-`CONTRADICTED` rate on authentic clips | 0.0% [0.0–18.4] (k=0, n=17) | +| `VERIFIED` coverage, mains-lit clips | 0.0% [0.0–19.4] (k=0, n=16) | +| Edit detection rate | 0.0% [0.0–43.4] (k=0, n=5) | +| Dropped-frame false alarms | 0.0% [0.0–79.3] (k=0, n=1) | +| Agent task success (verdict = expected) | 9.1% [2.5–27.8] (k=2, n=22) | +| Agent recovery rate (weak first extraction later usable) | 14.3% [2.6–51.3] (k=1, n=7) | +| Unnecessary-call rate | 0.0% [0.0–1.7] (k=0, n=224) | +| Human-review precision | 100.0% [20.7–100.0] (k=1, n=1) | +| Budget-exhaustion rate | 0.0% [0.0–14.9] (k=0, n=22) | + +| class (SYNTHETIC) | VERIFIED | CONTRADICTED | INCONCLUSIVE | no result | +|---|---|---|---|---| +| authentic-with-mains-light | 0 | 0 | 16 | 0 | +| authentic-without-mains-light | 0 | 0 | 1 | 0 | +| edited | 0 | 1 | 4 | 0 | + +With the placeholder match margin, every mains-lit calibration clip ended `NO_UNIQUE_MATCH` or `SIGNAL_WEAK`. Replaying the calibration statistics with the selected thresholds gives `VERIFIED` coverage 0.5625 and edit detection 0.4 with no false `CONTRADICTED` (fit recorded in the thresholds file). + +#### Reproduce + +``` +# from the repository root; PYTHONPATH must include the repo root and engine/ +python -m eval.run_eval --suite synthetic-v1 --split calibration --workers 4 --date 2026-10-27 --data data/synthetic/v1 +python -m eval.calibrate_thresholds results/eval/2026-10-27/synthetic-v1-fallback +python -m eval.run_eval --suite synthetic-v1 --split test --workers 4 --date 2026-10-27-test --data data/synthetic/v1 +python -m eval.make_report results/eval/2026-10-27/synthetic-v1-fallback +python -m eval.make_report results/eval/2026-10-27-test/synthetic-v1-fallback +``` + +To keep the repository small, overlay videos and per-job plots and PDFs were removed from `results/eval/` after the runs. Per-job `result.json`, `trace.json` and `job.json`, the clip records, the summaries and the failure-gallery PNG plots are kept. Re-running the commands regenerates the removed files. ### Real-world evaluation @@ -229,11 +382,32 @@ Dataset: `eval/DATASET.md`. Splits by recording day and phone. The false-`CONTRA Metrics (SPEC Part 11.5): confusion matrix against ground-truth classes, false-`CONTRADICTED` rate on authentic clips, `VERIFIED` coverage and `INCONCLUSIVE` rate per condition, time error for `VERIFIED` clips, edit detection rate and localization error, dropped-frame false alarms, signal survival per compression platform, experimental face-region results (separate), runtime per stage. -Results: generated by `eval/make_report.py` into `results/eval//`. (Tables are inserted here from those files.) +**Status: first real recordings, no accuracy claim.** The real dataset has not been recorded yet (human task, see `docs/HUMAN_TASKS.md`), and the thresholds in use are `PROVISIONAL` (synthetic calibration). On 2026-10-27 two real clips were recorded on an iPhone 13 with the stock camera app (1080p, 30 fps, indoor mains lighting in India, 50 Hz grid, about 44 s each) and run through the full engine : + +| Clip | Verdict | Reasons | Band SNR | DFT peak | Source | +|---|---|---|---|---|---| +| phone1 | `INCONCLUSIVE` | `SIGNAL_ABSENT`, `READOUT_ESTIMATED` | −5.68 dB | 120.0003 Hz | | +| phone2 | `INCONCLUSIVE` | `SIGNAL_ABSENT`, `READOUT_ESTIMATED` | −5.60 dB | 99.9957 Hz | | + +The stock camera app uses auto exposure and anti-banding, which suppress the flicker bands. The engine therefore reports no usable signal and does not guess. This is the expected behaviour for ordinary phone video (§11), and the reason the Capture app turns anti-banding off. The weak spectral peak near 100 Hz in phone2 (twice the 50 Hz grid) is below the detection threshold and is not used. The same phone2 recording was also uploaded to the live AWS deployment (job `cd65b6ea0c20`): the Graviton worker returned `INCONCLUSIVE` with `SIGNAL_ABSENT`, and the agent, reacting to the weak signal, asked for the original file and the camera model (behaviours B4 and B2 on real input) . ## 10. Failure cases -The failure-case gallery (at least ten cases, with overlays and plain explanations) is generated by `eval/make_report.py` into `results/eval//`. (Gallery is linked here from those files.) +Galleries (generated by `eval/make_report.py`, SYNTHETIC): +- Test split: [`failure_gallery/`](../results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/), listed with explanations at the end of its [`summary.md`](../results/eval/2026-10-27-test/synthetic-v1-fallback/summary.md). +- Calibration split (placeholder thresholds): [`failure_gallery/`](../results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/). + +The galleries keep the ENF-track and phase-residual PNG plots; the overlay videos were removed for size (see §9). + +The test split has 7 failures out of 22 clips. They fall into five groups, worst first: + +1. **Missed edits that ended `VERIFIED`** (`cut_0p5s__s1161`, `cut_1s__s1171`). The short cuts were explained as dropped frames (`DROPPED_FRAMES_EXPLAINED`), and the remaining track still matched the true time. Match margins were 0.054 and 0.065, above the calibrated minimum. This is the most serious failure: an edited clip received `VERIFIED`. The same miss happened in the AWS run of the `cut-1s` demo case (§6). +2. **Wrong-time `VERIFIED`** (`short_readout_long_expo__s1031`). After B1 recovery the track was poor (ENF RMSE 177.598 mHz) and matched a reference time 1342.182 s away from the truth, with margin 0.016. The calibrated margin minimum (the lowest value in the search grid) let it through. Calibration had no wrong-time `VERIFIED` on its own split; the test split shows the margin threshold is too loose. +3. **No unique match** (`jitter__s1041`, `web_compression__s1091`, and the edited `cut_2s__s1181`). The best and second-best reference offsets scored almost equally (margins 0.013, 0.005 and 0.003), so the verdict was `INCONCLUSIVE`. This is the intended safe outcome when the match is ambiguous. +4. **Signal too weak** (`weak_flicker__s1021`, band SNR 3.062 dB). The agent tried every B1 alternative and then stopped with `INCONCLUSIVE` (B5). +5. **HDR input** (`hdr__s1211`). The engine stops on HDR transfer functions by design (`HDR_UNSUPPORTED`), so the clip is `INCONCLUSIVE`; the manifest expected `VERIFIED`. + +Measurement issue found during the evaluation: for `insert_other_time__s1191` (correctly `CONTRADICTED`), the reported edit-event time lies outside the clip, which gives the 1478.067 s localization error above. The verdict is correct, but the edit-event timestamp cannot be used for localization until this is fixed. ## 11. Limitations diff --git a/docs/VIDEO_SCRIPT.md b/docs/VIDEO_SCRIPT.md index 28c765a..a47ff8a 100644 --- a/docs/VIDEO_SCRIPT.md +++ b/docs/VIDEO_SCRIPT.md @@ -1,98 +1,106 @@ -# Video script (maximum five minutes) - -This is the plan for human task H8 (`SPEC.md` Part 14.4). The final video must not be longer than five minutes. - -Number rule: this script contains no measured number. Each place that needs a measured value says "[value from results]" and has a source tag. Before recording, replace each "[value from results]" marker with the value from the named file and keep the tag in this file. The `` in each tag is the frozen results folder. - -Recording rules: -- Every result on screen comes from the live pipeline: the AWS endpoint, or `make local` when the endpoint is not public. No mock screens. -- Synthetic results on screen carry the label SYNTHETIC. -- Show the verdict card text and icon, not only color. -- Show the overlay label "Visualization of measured flicker. Not itself evidence." whenever the overlay is on screen. -- Do not use the words in the forbidden-claims list (SPEC R5). - -## Timed script - -### 0:00–0:20 Hook - -| Item | Content | -|---|---| -| Voice | "AI can fake a video. Now people call real videos fake. We check whether a video is real with the light in the room." | -| Shot 1 | Close shot of a white wall under a mains-powered lamp, recorded with GRIDPRINT Capture. The band overlay shows bands moving across the wall. | -| Shot 2 | Title card: "GRIDPRINT". | - -### 0:20–1:20 Capture → upload → `VERIFIED` - -| Item | Content | -|---|---| -| Voice | "Lights on the power grid flicker at twice the grid frequency. The grid frequency changes a little every second, and the whole grid shares the same pattern. A phone camera reads its sensor one row at a time, so the flicker shows as bands. GRIDPRINT reads the pattern from the bands and matches it with a log of the real grid." | -| Shot 3 | Phone screen: GRIDPRINT Capture with the live band-strength meter. Record a short clip in a room. | -| Shot 4 | Upload from Capture. Job page: progress and the live agent trace. | -| Shot 5 | Verdict card `VERIFIED` with the recording time and its uncertainty: [value from results] | -| Shot 6 | Evidence plot: video frequency track over the reference track. Grid zone shown. No finer location. | - -### 1:20–2:10 Cut clip → `CONTRADICTED` → reviewer approves - -| Item | Content | -|---|---| -| Voice | "Now we remove one second from the same clip and re-time it so it looks continuous. The flicker phase jumps at the cut. GRIDPRINT marks it. A person must approve this result before the report is final." | -| Shot 7 | Demo case 2 runs. Timeline strip with the red edit marker at the cut. | -| Shot 8 | Verdict card `CONTRADICTED`, state `PENDING_REVIEW`. Edit significance: [value from results] | -| Shot 9 | Reviewer logs in, reads the evidence, approves with a note. Report becomes `FINAL`. | - -### 2:10–2:40 Synthetic video → `INCONCLUSIVE` - -| Item | Content | -|---|---| -| Voice | "This room video comes from an AI video generator. It has no grid signal, so the result is INCONCLUSIVE. That alone does not mean fake. Many real videos have no signal too, for example in daylight." | -| Shot 10 | Demo case 5 runs. Verdict card `INCONCLUSIVE` with reason `SIGNAL_ABSENT` and the plain explanation text. | -| Shot 11 | Demo case 6 (daylight) result card, short. | - -### 2:40–3:30 Agent trace: weak signal → new patches → lock - -| Item | Content | -|---|---| -| Voice | "The agent reads the OpenCV results and changes its plan. Here the first pass gives a weak signal. The agent picks other light patches and extracts again. Now the signal locks. The agent never writes the verdict. Fixed rules do that." | -| Shot 12 | Demo case 7. Live trace: `extract_flicker` → `SIGNAL_WEAK` → `propose_patches` → `extract_flicker` → signal locks. | -| Shot 13 | Band SNR before and after: [value from results] and [value from results] | -| Shot 14 | Agent workflow diagram (`docs/diagrams/agent_workflow.svg`), highlight B1 and B6. | - -### 3:30–4:20 Architecture + measured COOL benchmark - -| Item | Content | -|---|---| -| Voice | "The engine runs OpenCV 5 on AWS Graviton. The agent plans each job and calls engine tools through MCP. Its planner is Claude on Amazon Bedrock, with a deterministic planner as fallback. The reference grid log comes from our GPS-timed Node." | -| Voice check | Before recording, match each sentence to the facts on that day: say "with COOL" only if the COOL benchmark ran (`results/bench/`); say "Claude on Amazon Bedrock" planned this job only if the shown trace has planner type `bedrock`; say "GPS-timed Node" only if the shown reference came from Node data (H2), otherwise name the source shown in the report. | -| Shot 15 | Architecture diagram (`docs/diagrams/architecture.svg`). Highlight engine stages, Graviton workers, Node path. | -| Shot 16 | Benchmark chart from `results/bench//`. Throughput for configurations A, B, C: [value from results] , [value from results] , [value from results] | -| Shot 17 | Cost per hour of video for each configuration: [value from results] | -| Note | Show only stages where the profile shows COOL symbols. If V5 failed, say "COOL was not available; this runs stock OpenCV 5 on Graviton" and show B vs A only. | - -### 4:20–5:00 Failure cases, limitations, team - -| Item | Content | -|---|---| -| Voice | "GRIDPRINT has limits. Phone anti-banding hides the flicker in many ordinary videos. Short clips, strong compression, HDR, and fast motion also stop the check. We measured how often this happens." | -| Shot 18 | Results table: false-`CONTRADICTED` rate on authentic clips: [value from results] | -| Shot 19 | `VERIFIED` coverage for Capture clips: [value from results] ; `INCONCLUSIVE` rate for stock-app clips: [value from results] | -| Shot 20 | Two or three items from the failure gallery (`results/eval//failures/`) with their plain explanations. | -| Shot 21 | Team on camera. Closing line: "GRIDPRINT: a check you can see in the light." | - -## Shot list summary - -| Shot | Source | Who | -|---|---|---| -| 1, 3 | Phone with GRIDPRINT Capture in a room with mains-powered lights | Team | -| 2 | Title card | Editor | -| 4–11 | Screen recording of the deployed Verify endpoint | Team | -| 12–14 | Screen recording of demo case 7 trace + agent diagram SVG | Team | -| 15–17 | Architecture SVG + benchmark chart from `results/bench/` | Editor | -| 18–20 | Tables and gallery from `results/eval/` | Editor | -| 21 | Camera on the team | Team | - -## Before upload - -1. Replace every "[value from results]" with the value from the tagged file. -2. Run `python scripts/check_numbers_sourced.py` and `python scripts/claims_lint.py`. -3. Check the duration: `python scripts/check_video_duration.py `. -4. Upload as public or unlisted. Put the link in `README.md` (line "Video:"). +# GRIDPRINT submission video: script + +Generated by `video/make_pitch.py`. Voice: edge-tts `en-US-AndrewNeural` (rate +0%). Duration: 195.4 s. +Style: ASD-STE100 Simplified Technical English (short sentences, active voice, one idea per sentence). + +Sources on screen: live AWS app screenshots (`video/assets/live/`, captured with headless Chrome), `data/public/fluorescent_beat_effect.mp4` (Wikimedia Commons, CC BY-SA 3.0), engine outputs in `results/video/engine_runs/`, agent trace `results/agent_traces/clean__s1001.json`, benchmark `results/bench/2026-10-27/`. + +## 01 THE PROBLEM / hook (00:00:00 - 00:00:07) + +- Today, anyone can generate a realistic video in minutes. +- It costs almost nothing, and it looks real. + +## 01 THE PROBLEM / dismiss (00:00:07 - 00:00:15) + +- This creates a second problem. +- When a video is real, people now say: it is just AI. +- True evidence loses its value. + +## 01 THE PROBLEM / bulb (00:00:15 - 00:00:29) + +- We need a fact from the physical world that a generator does not know. +- There is one, and it hangs above your head. +- Mains lights flicker with the power grid. +- The grid frequency drifts a little, all the time, and that drift marks the time. + +## 02 WHO NEEDS THIS / pain (00:00:29 - 00:00:43) + +- This problem hurts real people. +- Newsrooms must check footage before they publish it. +- Courts must decide which video to trust. +- Insurers must check claims that use video. +- Human-rights groups must defend footage that powerful people call AI. + +## 03 HOW IT WORKS / flicker (00:00:43 - 00:00:55) + +- Meet GRIDPRINT. It checks a video against the power grid. +- A mains light flickers at two times the grid frequency. +- On a fifty hertz grid, that is one hundred pulses each second. + +## 03 HOW IT WORKS / rolling (00:00:55 - 00:01:04) + +- A phone camera reads its sensor one row at a time. +- This is called a rolling shutter. +- So the fast flicker becomes faint horizontal bands in the image. + +## 03 HOW IT WORKS / overlay (00:01:04 - 00:01:14) + +- This is a public clip of a real fluorescent light. +- OpenCV 5 linearises the light, removes camera motion, and measures the bands in each frame. + +## 03 HOW IT WORKS / track (00:01:14 - 00:01:27) + +- From the band phase, the engine rebuilds the grid frequency track. +- Then it slides that track along the grid reference log. +- One clear match gives a recording time. A cut or an insertion breaks the match. + +## 04 THE PRODUCT / home (00:01:27 - 00:01:36) + +- GRIDPRINT runs live on AWS today. This is the web app. +- You upload a video. You can add a claimed grid zone and a claimed recording time. + +## 04 THE PRODUCT / cases (00:01:36 - 00:01:42) + +- Ready-made example cases run through the same live pipeline. +- One click starts a full analysis job. + +## 04 THE PRODUCT / job (00:01:42 - 00:01:55) + +- Here is a finished job. The verdict is VERIFIED, and the report is final. +- The page shows the estimated recording time and its uncertainty. +- Each verdict comes with reason codes in plain words. + +## 04 THE PRODUCT / trace (00:01:55 - 00:02:02) + +- An agent plans each analysis. +- It calls engine tools through an MCP server, and it logs every step. + +## 04 THE PRODUCT / reviewer (00:02:02 - 00:02:09) + +- A CONTRADICTED result is never final on its own. +- A human reviewer must approve it first. + +## 04 THE PRODUCT / limits (00:02:09 - 00:02:15) + +- The limitations page tells users what GRIDPRINT cannot do. +- Clear limits are part of the product. + +## 05 BUILT ON AWS / arch (00:02:15 - 00:02:48) + +- A video arrives through API Gateway and a load balancer. +- An API service on Fargate stores it in S3 with KMS keys, and puts a job on an SQS queue. +- Workers on Graviton4 run the OpenCV 5 engine in fifteen stages. +- An agent with twelve MCP tools uses Amazon Nova Lite on Bedrock to plan each run, inside strict policies. +- DynamoDB keeps jobs and the grid log. IoT Core brings in grid data. Cognito signs in reviewers. + +## 05 BUILT ON AWS / bench (00:02:48 - 00:02:58) + +- We measured the same engine on Graviton and on x86. +- Graviton processed more video per second, at a lower cost per video hour. + +## 06 THE VERDICT / close (00:02:58 - 00:03:14) + +- GRIDPRINT gives exactly three verdicts: VERIFIED, CONTRADICTED, or INCONCLUSIVE. +- A missing signal never counts against a video. +- It needs mains lighting, and many phone videos will be INCONCLUSIVE. +- GRIDPRINT. Evidence from the light in the room. diff --git a/docs/devpost/01_home.png b/docs/devpost/01_home.png new file mode 100644 index 0000000..6bdd2f1 Binary files /dev/null and b/docs/devpost/01_home.png differ diff --git a/docs/devpost/02_job.png b/docs/devpost/02_job.png new file mode 100644 index 0000000..4453f6b Binary files /dev/null and b/docs/devpost/02_job.png differ diff --git a/docs/devpost/03_trace.png b/docs/devpost/03_trace.png new file mode 100644 index 0000000..c461e81 Binary files /dev/null and b/docs/devpost/03_trace.png differ diff --git a/docs/devpost/04_reviewer.png b/docs/devpost/04_reviewer.png new file mode 100644 index 0000000..ac15762 Binary files /dev/null and b/docs/devpost/04_reviewer.png differ diff --git a/docs/devpost/05_limits.png b/docs/devpost/05_limits.png new file mode 100644 index 0000000..f799174 Binary files /dev/null and b/docs/devpost/05_limits.png differ diff --git a/docs/devpost/06_architecture.png b/docs/devpost/06_architecture.png new file mode 100644 index 0000000..3ed80ee Binary files /dev/null and b/docs/devpost/06_architecture.png differ diff --git a/docs/devpost/GRIDPRINT_judge_pack.zip b/docs/devpost/GRIDPRINT_judge_pack.zip new file mode 100644 index 0000000..800d0d6 Binary files /dev/null and b/docs/devpost/GRIDPRINT_judge_pack.zip differ diff --git a/docs/devpost/story.md b/docs/devpost/story.md new file mode 100644 index 0000000..7f145a9 --- /dev/null +++ b/docs/devpost/story.md @@ -0,0 +1,94 @@ +## Inspiration + +Generated video is now cheap. The worse side effect: people now dismiss **real** video as "AI". Newsrooms, courts, insurers and human-rights groups receive footage that they cannot easily defend. Pixel detectors guess. Metadata disappears on the first re-upload. + +We wanted a physical signal that lives inside the pixels. We found one in the ceiling light. + +## What it does + +Lights on mains power flicker at twice the grid frequency (100 or 120 Hz). The grid frequency is never exactly 50 or 60 Hz. It drifts all the time. The drift is the same across a whole grid zone and is logged second by second. This is the **electric network frequency (ENF)**. + +A phone camera has a rolling shutter: it reads one sensor row at a time. So the flicker turns into faint horizontal bands in every frame. GRIDPRINT: + +1. Measures those bands with **OpenCV 5**. +2. Rebuilds the ENF track of the clip. +3. Matches the track to grid reference logs. +4. Reports **when** the video was recorded, whether parts were **cut, inserted or reordered**, and which **grid zone** it matches. It never reports a finer location. + +There are exactly three verdicts: + +- **VERIFIED**: a grid signal is present and matches the reference log at one time. Final at once. +- **INCONCLUSIVE**: not enough signal or reference to decide. Final at once. +- **CONTRADICTED**: the evidence conflicts with the claim. A human reviewer must approve it before the report is final. + +A missing signal never counts against a video. Every verdict carries machine-readable reason codes, a band overlay video and an accessible HTML/PDF report. + +**It runs live on AWS:** https://5u7suz00bi.execute-api.us-east-1.amazonaws.com + +## How we built it + +**OpenCV 5 engine (15 stages).** The signal path stays in float32/float64, in linear light, and never interpolates across the rolling-shutter idle gap. + +- **Linear light:** `cv2.LUT` undoes the camera gamma before any normalization. +- **Motion and static-scene masks:** `goodFeaturesToTrack`, `calcOpticalFlowPyrLK`, `findHomography` with `USAC_MAGSAC`, and `DISOpticalFlow`. Each frame registers directly to a reference frame. +- **Person masks:** the `cv2.dnn` module removes moving people from the light patches. +- **Light patches and row signal:** `warpPerspective` samples stable, well-lit surfaces row by row. +- **Phase and frequency:** a per-frame flicker phase fit with `cv2.solve`, cross-checked with `cv2.dft` on a gap-masked time grid. +- **Continuity:** two-sided phase fits find cuts, insertions and reordering. +- **Face region (experimental):** `FaceDetectorYN`. +- **Output:** `applyColorMap` and `VideoWriter` render the band overlay video. + +**Agent.** An MCP server exposes 12 engine tools. A planner on **Amazon Bedrock (Amazon Nova Lite)** picks the next tool from OpenCV measurements. For example, it re-selects light patches after a weak signal. Code-enforced policies keep the verdict deterministic, cap the budget, and block a final CONTRADICTED report until a human approves. A deterministic planner takes over if a model step fails or breaks a policy. Every step is traced and shown in the app. + +**AWS (all in AWS CDK v2):** + +- **Amazon ECS on Graviton4 (c8g)** runs the engine workers, built for `linux/arm64`. +- **AWS Fargate (arm64)** runs the FastAPI service and web app behind **Elastic Load Balancing**. +- **Amazon API Gateway** gives the public HTTPS endpoint through a VPC link. +- **Amazon SQS** queues jobs. **Amazon DynamoDB** stores jobs, reviews, traces and the grid log. +- **Amazon S3 + AWS KMS** hold uploads and reports, encrypted. +- **Amazon Cognito** holds the reviewer group for the CONTRADICTED gate. +- **AWS IoT Core + AWS Lambda** ingest the grid reference Node. +- **Amazon CloudWatch** for logs, dashboards and alarms. **Amazon ECR** for images. + +**Capture app (Android, Camera2):** auto-exposure and anti-banding off, short exposure, per-frame sensor timestamps and readout skew in a signed sidecar file. + +**Grid reference Node (ESP32 + GPS PPS):** design, firmware and cloud ingest. Safety first: it uses a certified plug-in AC adapter only. + +## Graviton4 vs x86 + +We ran the same engine and the same pinned input on equal-size instances, with stock OpenCV 5.0.0, 5 runs each: + +| | x86 `c7i.2xlarge` | Graviton4 `c8g.2xlarge` | +|---|---|---| +| Throughput (video-s per wall-s) | 0.92 | **1.20** | +| Cost per video-hour (on-demand, us-east-1) | $0.390 | **$0.266** | + +Graviton4 processes about 31% more video per second and costs about 32% less per hour of video. These are speed and cost numbers only. They say nothing about accuracy. + +## Challenges we ran into + +- **The wrong readout direction gives a convincing but false frequency track.** We rank the candidates by physical plausibility. +- **Chained homographies drifted.** Frame-to-frame homographies drifted on a fixed camera and smeared the scene. Registering each frame directly to one reference frame fixed it. +- **Some cuts hide in the phase.** If a cut is a whole number of flicker periods long, the phase moves only by the grid deviation. Two-sided phase fits made those small jumps measurable. +- **New-account AWS limits** (vCPU quota, CloudFront verification) shaped the deployment. We moved the public edge to API Gateway with a VPC link. + +## Accomplishments that we're proud of + +- **An honest product:** three verdicts, a mandatory human review for CONTRADICTED, and no claim beyond the evidence. +- **An agent that reacts to vision measurements,** with policies that keep it safe when the model is wrong. +- **One engine, two architectures:** the same code runs on Graviton4 and x86 with stock OpenCV 5, and Graviton4 wins on throughput and cost. +- **A full system:** capture app, grid reference Node, cloud pipeline, reviewer workflow and reports. + +## What we learned + +Physics-based provenance is strong but narrow. It needs mains lighting and a camera that does not hide the flicker. Saying so plainly is part of the product. + +## What's next + +- Grid reference Nodes in more grid zones. +- Real-world evaluation with consenting participants. +- The Capture app on more phones. +- OpenCV-accelerated workers with COOL once our Marketplace subscription is active. + +**Code:** https://github.com/vivekyarra/Alibi diff --git a/docs/devpost/thumbnail.png b/docs/devpost/thumbnail.png new file mode 100644 index 0000000..0d80429 Binary files /dev/null and b/docs/devpost/thumbnail.png differ diff --git a/docs/screenshots/ui_home.png b/docs/screenshots/ui_home.png new file mode 100644 index 0000000..065e77a Binary files /dev/null and b/docs/screenshots/ui_home.png differ diff --git a/docs/screenshots/ui_job.png b/docs/screenshots/ui_job.png new file mode 100644 index 0000000..d3de9d9 Binary files /dev/null and b/docs/screenshots/ui_job.png differ diff --git a/docs/screenshots/ui_limitations.png b/docs/screenshots/ui_limitations.png new file mode 100644 index 0000000..ab649d0 Binary files /dev/null and b/docs/screenshots/ui_limitations.png differ diff --git a/docs/screenshots/ui_reviewer.png b/docs/screenshots/ui_reviewer.png new file mode 100644 index 0000000..76b850e Binary files /dev/null and b/docs/screenshots/ui_reviewer.png differ diff --git a/docs/screenshots/ui_trace.png b/docs/screenshots/ui_trace.png new file mode 100644 index 0000000..d1fed33 Binary files /dev/null and b/docs/screenshots/ui_trace.png differ diff --git a/engine/gridprint_engine/continuity.py b/engine/gridprint_engine/continuity.py index 2b27d6b..d8362a9 100644 --- a/engine/gridprint_engine/continuity.py +++ b/engine/gridprint_engine/continuity.py @@ -52,13 +52,18 @@ def _side_fits(t: np.ndarray, y: np.ndarray, lo: np.ndarray, hi: np.ndarray, tb: def check_continuity(t_frame: np.ndarray, phi_unwrapped: np.ndarray, gaps: list[GapEvent], - jump_window_s: float, thr: dict[str, float], min_side_frames: int = 8) -> ContinuityResult: + jump_window_s: float, thr: dict[str, float], min_side_frames: int = 8, + t_clip: np.ndarray | None = None) -> ContinuityResult: + """`t_frame` (sensor or pts time) drives the fits. Reported times (events, raw boundaries, residual series) are + in-clip times `t_clip[frame]` when given, so a splice whose sensor timestamps come from another recording is + still located inside the clip.""" ok = ~np.isnan(phi_unwrapped) idx = np.flatnonzero(ok) if len(idx) < 2 * min_side_frames: return ContinuityResult([], np.zeros(0), np.zeros(0), []) t = t_frame[idx].astype(np.float64) phi = phi_unwrapped[idx].astype(np.float64) + tc = (t_frame if t_clip is None else t_clip)[idx].astype(np.float64) # boundary j lies between samples j and j+1 tb = 0.5 * (t[1:] + t[:-1]) j = np.arange(len(t) - 1) @@ -87,13 +92,13 @@ def check_continuity(t_frame: np.ndarray, phi_unwrapped: np.ndarray, gaps: list[ if not peak[i] and gap is None: continue significant = bool(peak[i] and z[i] > sig_thr and abs(jump[i]) >= min_rad) - raw.append({"t_s": float(t[i + 1]), "z": float(z[i]), "rad": float(abs(jump[i])), "gap": gap is not None}) + raw.append({"t_s": float(tc[i + 1]), "z": float(z[i]), "rad": float(abs(jump[i])), "gap": gap is not None}) if gap is not None and not significant: - events.append(ContinuityEvent(kind="DROPPED_FRAMES_EXPLAINED", frame_index=k, t_s=float(t[i + 1]), + events.append(ContinuityEvent(kind="DROPPED_FRAMES_EXPLAINED", frame_index=k, t_s=float(tc[i + 1]), magnitude_rad=float(jump[i]), significance=float(z[i]), significant=False, gap_s=gap.size_s)) elif significant: - events.append(ContinuityEvent(kind="EDIT_CANDIDATE", frame_index=k, t_s=float(t[i + 1]), + events.append(ContinuityEvent(kind="EDIT_CANDIDATE", frame_index=k, t_s=float(tc[i + 1]), magnitude_rad=float(jump[i]), significance=float(z[i]), significant=True, gap_s=gap.size_s if gap else None)) reasons: list[Reason] = [] @@ -103,4 +108,5 @@ def check_continuity(t_frame: np.ndarray, phi_unwrapped: np.ndarray, gaps: list[ reasons.append(Reason.DROPPED_FRAMES_EXPLAINED) # series for plots: the estimated phase jump at every boundary with enough frames on both sides valid = (nl >= min_side_frames) & (nr >= min_side_frames) - return ContinuityResult(events, tb[valid], jump[valid], reasons, raw) + tbc = 0.5 * (tc[1:] + tc[:-1]) + return ContinuityResult(events, tbc[valid], jump[valid], reasons, raw) diff --git a/engine/gridprint_engine/io.py b/engine/gridprint_engine/io.py index 941fc12..4c05d67 100644 --- a/engine/gridprint_engine/io.py +++ b/engine/gridprint_engine/io.py @@ -125,6 +125,12 @@ class Timing: gaps: list[GapEvent] = field(default_factory=list) wall_start_utc: float | None = None assumption: str = "" + # in-clip (presentation) time of every frame, pts relative to the first frame. Differs from t_s when the + # sensor timestamps of a spliced clip come from another recording; reported event times use this axis. + clip_t_s: np.ndarray | None = None + + def clip_times(self) -> np.ndarray: + return self.clip_t_s if self.clip_t_s is not None else self.t_s def _robust_linear_fit(x: np.ndarray, y: np.ndarray, iters: int = 5) -> tuple[float, float, np.ndarray]: @@ -158,16 +164,18 @@ def compute_timing(pts_s: np.ndarray, sidecar: CaptureSidecar | None, gap_factor wall = None assumption = "pts_is_first_row_exposure_start" t = ts - ts[0] + pts = np.asarray(pts_s, dtype=np.float64) + clip_t = pts - pts[0] if len(pts) == len(t) else t dt = np.diff(t) med = float(np.median(dt)) if len(dt) else 0.0 - gaps = [GapEvent(frame_index=i + 1, t_s=float(t[i + 1]), size_s=float(d - med)) + gaps = [GapEvent(frame_index=i + 1, t_s=float(clip_t[i + 1]), size_s=float(d - med)) for i, d in enumerate(dt) if med > 0 and d > gap_factor * med] n_idx = np.round(t / med).astype(np.float64) if med > 0 else np.arange(len(t), dtype=np.float64) _, _, res = _robust_linear_fit(n_idx, t) ares = np.abs(res) * 1e3 return Timing(t_s=t, exposure_s=expo, source=source, jitter_p50_ms=float(np.percentile(ares, 50)), jitter_p95_ms=float(np.percentile(ares, 95)), median_dt_s=med, gaps=gaps, - wall_start_utc=wall, assumption=assumption) + wall_start_utc=wall, assumption=assumption, clip_t_s=clip_t) @dataclass diff --git a/engine/gridprint_engine/overlay.py b/engine/gridprint_engine/overlay.py index d6681cc..929e480 100644 --- a/engine/gridprint_engine/overlay.py +++ b/engine/gridprint_engine/overlay.py @@ -46,7 +46,7 @@ def bandpass_frame(m: np.ndarray, i: int, center_hz: float, fps: float, taps: in def _strip(job: Job, width: int, t_now: float) -> np.ndarray: assert job.timing is not None strip = np.full((STRIP_H, width, 3), 32, np.uint8) - dur = max(float(job.timing.t_s[-1]), 1e-6) + dur = max(float(job.timing.clip_times()[-1]), 1e-6) def x(t: float) -> int: return int(np.clip(t / dur * (width - 1), 0, width - 1)) @@ -98,7 +98,7 @@ def render_overlay(job: Job, out_path: Path, scale: int = 2) -> Path | None: fr = cv2.resize(fr, (W, H), interpolation=cv2.INTER_NEAREST) cv2.rectangle(fr, (0, 0), (W, 16), (0, 0, 0), -1) cv2.putText(fr, LABEL, (4, 12), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (255, 255, 255), 1, cv2.LINE_AA) - vw.write(np.vstack([fr, _strip(job, W, float(tm.t_s[i]))])) + vw.write(np.vstack([fr, _strip(job, W, float(tm.clip_times()[i]))])) vw.release() # re-encode to H.264 for browser playback (ffmpeg CLI; per-frame conversion in Python is slow) subprocess.run(["ffmpeg", "-y", "-loglevel", "error", "-i", str(tmp), "-c:v", "libx264", "-preset", "veryfast", diff --git a/engine/gridprint_engine/pipeline.py b/engine/gridprint_engine/pipeline.py index 26629e1..cf04d93 100644 --- a/engine/gridprint_engine/pipeline.py +++ b/engine/gridprint_engine/pipeline.py @@ -466,7 +466,8 @@ def check_continuity(self, track_id: str | None = None) -> dict[str, Any]: phi = np.where(tr.fits.snr >= self.E["continuity"]["min_frame_snr"], tr.track.phase_unwrapped, np.nan) with self._timed("S11_continuity"): res = s11.check_continuity(self.timing.t_s, phi, self.timing.gaps, - self.E["continuity"]["jump_window_s"], self.cfg.thresholds["continuity"]) + self.E["continuity"]["jump_window_s"], self.cfg.thresholds["continuity"], + t_clip=self.timing.clip_times()) self.continuity[tr.id] = res return {"track_id": tr.id, "events": [e.model_dump() for e in res.events][:50], "edit_candidates": sum(e.kind == "EDIT_CANDIDATE" for e in res.events), diff --git a/engine/gridprint_engine/report.py b/engine/gridprint_engine/report.py index 32b559c..ebcb74d 100644 --- a/engine/gridprint_engine/report.py +++ b/engine/gridprint_engine/report.py @@ -119,7 +119,7 @@ def _plots(job: Job, outdir: Path) -> list[dict[str, str]]: "Dotted line: timestamp gap."}) # 4. per-frame band amplitude fig, ax = plt.subplots(figsize=(8, 2.4)) - ax.plot(job.timing.t_s, np.where(tr.fits.ok, tr.fits.amp, np.nan), lw=0.8) + ax.plot(job.timing.clip_times(), np.where(tr.fits.ok, tr.fits.amp, np.nan), lw=0.8) ax.set_xlabel("time in video (s)") ax.set_ylabel("band amplitude") fig.tight_layout() diff --git a/engine/gridprint_engine/tests/test_units.py b/engine/gridprint_engine/tests/test_units.py index 71924e1..8fe2ed8 100644 --- a/engine/gridprint_engine/tests/test_units.py +++ b/engine/gridprint_engine/tests/test_units.py @@ -228,6 +228,36 @@ def test_dropped_frames_with_true_timestamps_not_flagged(): assert Reason.DROPPED_FRAMES_EXPLAINED in res.reasons + +def test_edit_event_time_is_in_clip_time_not_sensor_time(): + # spliced clip: sensor timestamps come from another recording (offset by about -1470 s); the reported event + # time must be the boundary's position inside the clip (eval defect B, insert_other_time__s1191) + t, phi = _phase_series(jump_at=400, jump=0.6) + res = continuity.check_continuity(t - 1470.0, phi, [], 4.0, THR["continuity"], t_clip=t) + ed = [e for e in res.events if e.kind == "EDIT_CANDIDATE"] + assert len(ed) == 1 and ed[0].frame_index == 400 + assert ed[0].t_s == pytest.approx(t[400]) + assert all(b["t_s"] >= 0 for b in res.boundaries) + assert res.residual_t.min() >= 0 + + +def test_timing_clip_times_follow_pts_when_sensor_timestamps_jump(): + from gridprint_engine import io + + k, dt = 120, 1 / 30 + pts = np.arange(k) * dt + sensor_s = pts.copy() + sensor_s[60:] = pts[60:] - 1500.0 # inserted footage keeps its own (earlier) sensor timestamps + ns = [int(round((v + 2000.0) * 1e9)) for v in sensor_s] + sc = CaptureSidecar(app_version="t", device_model="t", sensor_orientation=0, frame_sensor_timestamps_ns=ns, + frame_exposure_ns=[1_000_000] * k, frame_duration_ns=[33_333_333] * k, + rolling_shutter_skew_ns=25_000_000, iso=100, wall_clock_start_utc="2026-01-01T00:00:00+00:00", + wall_clock_source="test", zone="SIM50", video_sha256="0" * 64) + tm = io.compute_timing(pts, sc, 1.5) + assert tm.source == "sensor" and tm.t_s[60] < -1000 + np.testing.assert_allclose(tm.clip_times(), pts) + assert all(0 <= g.t_s <= pts[-1] for g in tm.gaps) + # ---------------------------------------------------------------- S4 motion def test_motion_static_scene_with_moving_bands_is_static(): from gridprint_engine import motion diff --git a/eval/make_demo_inputs.py b/eval/make_demo_inputs.py index 4658439..99ef552 100644 --- a/eval/make_demo_inputs.py +++ b/eval/make_demo_inputs.py @@ -17,7 +17,7 @@ start_utc=1768903200.0) # 2026-01-20T10:00:00Z CASES = { "capture-verified": replace(BASE, sidecar=True), - "cut-1s": replace(BASE, edits=[{"type": "cut", "at_s": 31.2, "dur_s": 1.0}]), + "cut-1s": replace(BASE, edits=[{"type": "cut", "at_s": 31.2, "dur_s": 1.25}]), "insertion": replace(BASE, edits=[{"type": "insert", "at_s": 30.0, "dur_s": 32.0, "from_offset_s": -1500.0}]), "dropped-frames": replace(BASE, sidecar=True, drop_frames=[(600, 6), (1300, 9)]), # other seeds use other days, so their reference spans (±1 h) never overlap in zone SIM50 diff --git a/eval/metrics.py b/eval/metrics.py index 28a36be..e8c743f 100644 --- a/eval/metrics.py +++ b/eval/metrics.py @@ -10,6 +10,14 @@ VERDICTS = ["VERIFIED", "CONTRADICTED", "INCONCLUSIVE", None] CLASSES = ["authentic-with-mains-light", "authentic-without-mains-light", "edited", "synthetic"] +# reasons behind verdict rule S13.2 (CONTRADICTED because of an edit, not because of a claimed-time mismatch) +EDIT_REASONS = frozenset({"EDIT_CANDIDATE", "SEGMENT_OFFSET_INCONSISTENT"}) + + +def edit_detected(r: dict[str, Any]) -> bool: + """An edited clip counts as detected when its verdict is CONTRADICTED with an edit reason. Whether the ground + truth gives an edit time does not matter (a reorder has none); localization error is a separate metric.""" + return r.get("verdict") == "CONTRADICTED" and bool(EDIT_REASONS & set(r.get("reasons") or [])) def wilson(k: int, n: int, z: float = 1.96) -> tuple[float | None, float | None, float | None]: @@ -53,7 +61,7 @@ def summarize(recs: list[dict[str, Any]]) -> dict[str, Any]: te = [abs(r["time_error_s"]) for r in recs if r.get("verdict") == "VERIFIED" and r.get("time_error_s") is not None] out["time_error_verified_s"] = _dist(te) out["enf_rmse_mhz"] = _dist([r["enf_rmse_mhz"] for r in recs if r.get("enf_rmse_mhz") is not None]) - out["edit_detection"] = rate(sum(bool(r.get("edit_detected")) for r in edited), len(edited)) + out["edit_detection"] = rate(sum(edit_detected(r) for r in edited), len(edited)) loc = [e for r in edited for e in (r.get("edit_localization_error_s") or [])] out["edit_localization_error_s"] = _dist(loc) dropped = [r for r in recs if r["condition"] == "dropped_frames"] diff --git a/eval/run_eval.py b/eval/run_eval.py index 099ce4e..fbafaab 100644 --- a/eval/run_eval.py +++ b/eval/run_eval.py @@ -61,6 +61,7 @@ def run_clip(item: dict[str, Any], data_dir: str, out_dir: str, planner_kind: st sys.path[:0] = [str(REPO), str(REPO / "engine")] from agent.fallback_planner import FallbackPlanner from agent.orchestrator import run_in_process + from eval.metrics import edit_detected from eval.replay import raw_from_job from gridprint_engine.adapters import LocalGridLog, LocalJobStore from gridprint_engine.config import settings @@ -118,10 +119,10 @@ def run_clip(item: dict[str, Any], data_dir: str, out_dir: str, planner_kind: st events = [e for e in (res.continuity_events or []) if e.kind == "EDIT_CANDIDATE"] rec["edits_true_t_s"] = edit_times rec["edit_events_t_s"] = [e.t_s for e in events] - if edit_times: - errs = [min(abs(t - e.t_s) for e in events) for t in edit_times] if events else [] - rec["edit_localization_error_s"] = errs - rec["edit_detected"] = bool(res.verdict.value == "CONTRADICTED") + if item["class"] == "edited": + rec["edit_detected"] = edit_detected(rec) + if edit_times: # localization only where the ground truth gives an edit time + rec["edit_localization_error_s"] = [min(abs(t - e.t_s) for e in events) for t in edit_times] if events else [] rec["dropped_false_alarm"] = bool(truth.get("dropped") and not truth.get("edits") and any(e.kind == "EDIT_CANDIDATE" for e in res.continuity_events)) return rec diff --git a/eval/tests/test_eval.py b/eval/tests/test_eval.py index 6eedde0..8c46d4b 100644 --- a/eval/tests/test_eval.py +++ b/eval/tests/test_eval.py @@ -63,6 +63,26 @@ def test_calibration_respects_target_and_picks_coverage(): assert thr["continuity"]["edit_significance_sigma"] >= 8.0 or thr["continuity"]["edit_min_rad"] > 0.2 +def test_edit_detection_counts_contradicted_edits_without_truth_time(): + base = {"class": "edited", "condition": "x", "expected_verdict": "CONTRADICTED"} + recs = [ + # insert: truth time present, localized + {**base, "name": "a", "verdict": "CONTRADICTED", "reasons": ["EDIT_CANDIDATE"], "edits_true_t_s": [30.0], + "edit_localization_error_s": [0.5]}, + # reorder: no truth time, still a correct detection; no localization entry + {**base, "name": "b", "verdict": "CONTRADICTED", "reasons": ["SEGMENT_OFFSET_INCONSISTENT"], + "edits_true_t_s": []}, + # CONTRADICTED only by a claimed-time mismatch is not an edit detection + {**base, "name": "c", "verdict": "CONTRADICTED", "reasons": ["CLAIM_TIME_MISMATCH"], "edits_true_t_s": [5.0], + "edit_localization_error_s": []}, + {**base, "name": "d", "verdict": "VERIFIED", "reasons": ["MATCH_OK"], "edits_true_t_s": [5.0], + "edit_localization_error_s": []}, + ] + s = metrics.summarize(recs) + assert (s["edit_detection"]["k"], s["edit_detection"]["n"]) == (2, 4) + assert s["edit_localization_error_s"] == {"n": 1, "mean": 0.5, "median": 0.5, "p95": 0.5, "max": 0.5} + + def test_dataset_validator_reports_problems(tmp_path: Path): m = {"dataset_version": "t", "clips": [{"clip_id": "a", "file": "a.mp4", "app": "nope", "people_present": True, "consent_ids": [], "gt_start_utc": "x"}]} diff --git a/pyproject.toml b/pyproject.toml index f049047..62c15b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,10 @@ extend-exclude = ["web", "capture-android", "results"] select = ["E", "F", "W", "I", "B", "UP"] ignore = ["E741"] +[tool.ruff.lint.per-file-ignores] +# video renderers: long drawing calls and coordinate tables +"video/*.py" = ["E501", "B905", "B007"] + [tool.ruff.lint.isort] known-first-party = ["gridprint_engine", "agent", "api", "mcp_server", "eval", "node", "scripts", "bench", "calibration_rig", "infra", "gridprint_infra"] diff --git a/results/agent_traces/clean__s1001.json b/results/agent_traces/clean__s1001.json new file mode 100644 index 0000000..0fb3531 --- /dev/null +++ b/results/agent_traces/clean__s1001.json @@ -0,0 +1,145 @@ +{ + "job_id": "clean__s1001", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T03:48:45.235022+00:00", + "t_end": "2026-10-27T03:49:07.737008+00:00", + "planner": "fallback", + "model_id": null, + "tool": "probe_video", + "input_summary": "{\"job_id\":\"clean__s1001\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":1080,\"bitrate\":456522,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "start: read metadata and timing", + "duration_s": 22.502, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T03:49:07.747389+00:00", + "t_end": "2026-10-27T03:49:07.749412+00:00", + "planner": "fallback", + "model_id": null, + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"clean__s1001\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "readout: sidecar, then profile, then blind", + "duration_s": 0.002, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T03:49:07.750945+00:00", + "t_end": "2026-10-27T03:50:38.818968+00:00", + "planner": "fallback", + "model_id": null, + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"clean__s1001\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1115,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"clean__s1001:normal\",\"segmentation\":\"model_unavailable\",\"low_motion_frames\":null}", + "decision_reason": "find static background", + "duration_s": 91.068, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T03:50:38.821512+00:00", + "t_end": "2026-10-27T03:50:51.262906+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"clean__s1001\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":55,\"score_db\":19.66},{\"id\":62,\"score_db\":19.17},{\"id\":63,\"score_db\":19.17},{\"id\":45,\"score_db\":19.04},{\"id\":14,\"score_db\":19.01},{\"id\":41,\"score_db\":18.98},{\"id\":49,\"score_db\":18.92},{\"id\":50,\"score_db\":18.78},{\"id\":46,\"score_db\":18.74},{\"id\":60,\"score_db\":18.72},{\"id\":21,\"score_db\":18.7},{\"id\":59,\"score_db\":18.63},{\"id\":20,\"score_db\":18.56},{\"id\":13,\"score_db\":18.5...", + "decision_reason": "rank light patches", + "duration_s": 12.4414, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T03:50:51.271347+00:00", + "t_end": "2026-10-27T03:50:54.903194+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"clean__s1001\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.046,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":100.0331,\"dft_peak_hz\":100.03636,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.09}}", + "decision_reason": "first extraction on all eligible patches", + "duration_s": 3.6318, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 5, + "t_start": "2026-10-27T03:50:54.905733+00:00", + "t_end": "2026-10-27T03:50:56.456598+00:00", + "planner": "fallback", + "model_id": null, + "tool": "match_reference", + "input_summary": "{\"job_id\":\"clean__s1001\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768853185.9290018,\"rho1\":0.9883607690571746,\"rho2\":0.9368937511344877,\"margin\":0.05146701792268693,\"psr\":2.7880008549949182,\"track_length_s\":35.0,\"time_uncertainty_s\":1.7049859311771116,\"segments_consistent\":null,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "signal usable (band SNR 11.046 dB); match against the reference", + "duration_s": 1.5509, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T03:50:56.458609+00:00", + "t_end": "2026-10-27T03:50:56.461731+00:00", + "planner": "fallback", + "model_id": null, + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"clean__s1001\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[],\"edit_candidates\":0,\"dropped_explained\":0,\"reasons\":[]}", + "decision_reason": "check phase continuity for edits", + "duration_s": 0.0031, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T03:50:56.463765+00:00", + "t_end": "2026-10-27T03:50:56.468296+00:00", + "planner": "fallback", + "model_id": null, + "tool": "face_region_check", + "input_summary": "{\"job_id\":\"clean__s1001\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"status\":\"model_unavailable\",\"label\":\"EXPERIMENTAL\",\"ratio\":null,\"significance\":null,\"frames_with_faces\":0,\"anomaly\":false}", + "decision_reason": "experimental face-region check", + "duration_s": 0.0045, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T03:50:56.470337+00:00", + "t_end": "2026-10-27T03:51:00.467466+00:00", + "planner": "fallback", + "model_id": null, + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"clean__s1001\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"MATCH_OK\"],\"rule\":\"S13.4\"}", + "decision_reason": "evidence complete; deterministic verdict", + "duration_s": 3.9971, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T03:51:00.469507+00:00", + "t_end": "2026-10-27T03:53:12.098944+00:00", + "planner": "fallback", + "model_id": null, + "tool": "render_report", + "input_summary": "{\"job_id\":\"clean__s1001\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\clean__s1001\\\\overlay.mp4\",\"report_html\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\clean__s1001\\\\report.html\",\"report_pdf\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\clean__s1001\\\\report.pdf\",\"report_json\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\clean__s1001\\\\result.json\",\"plot_enf_track\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\...", + "decision_reason": "render report", + "duration_s": 131.6294, + "error": null, + "policy_note": null + } + ] +} \ No newline at end of file diff --git a/results/agent_traces/messaging_compression__s1100.json b/results/agent_traces/messaging_compression__s1100.json new file mode 100644 index 0000000..a8e8eb7 --- /dev/null +++ b/results/agent_traces/messaging_compression__s1100.json @@ -0,0 +1,173 @@ +{ + "job_id": "messaging_compression__s1100", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T02:09:07.932699+00:00", + "t_end": "2026-10-27T02:09:36.005218+00:00", + "planner": "fallback", + "model_id": null, + "tool": "probe_video", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":1080,\"bitrate\":50571,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":true,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "start: read metadata and timing", + "duration_s": 28.0725, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T02:09:36.007734+00:00", + "t_end": "2026-10-27T02:09:36.010802+00:00", + "planner": "fallback", + "model_id": null, + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "readout: sidecar, then profile, then blind", + "duration_s": 0.0031, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T02:09:36.012906+00:00", + "t_end": "2026-10-27T02:13:11.110060+00:00", + "planner": "fallback", + "model_id": null, + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.3872,\"static_fraction\":0.9998,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"messaging_compression__s1100:normal\",\"segmentation\":\"model_unavailable\",\"low_motion_frames\":null}", + "decision_reason": "find static background", + "duration_s": 215.0972, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T02:13:11.201562+00:00", + "t_end": "2026-10-27T02:13:29.063398+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":63,\"score_db\":8.12},{\"id\":62,\"score_db\":8.09},{\"id\":23,\"score_db\":7.58},{\"id\":46,\"score_db\":7.05},{\"id\":54,\"score_db\":7.02},{\"id\":47,\"score_db\":6.91},{\"id\":36,\"score_db\":6.71},{\"id\":39,\"score_db\":6.63},{\"id\":12,\"score_db\":6.31},{\"id\":22,\"score_db\":6.2},{\"id\":55,\"score_db\":6.17},{\"id\":37,\"score_db\":5.98},{\"id\":44,\"score_db\":5.92},{\"id\":17,\"score_db\":5.82},{\"id\":38,\"s...", + "decision_reason": "rank light patches", + "duration_s": 17.8618, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T02:13:29.169185+00:00", + "t_end": "2026-10-27T02:13:41.460932+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":5.865,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":99.96839,\"dft_peak_hz\":99.97114,\"estimators_agree\":true,\"reasons\":[\"SIGNAL_WEAK\"],\"candidates\":{\"rows+@100\":5.83}}", + "decision_reason": "first extraction on all eligible patches", + "duration_s": 12.2917, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T02:13:41.464953+00:00", + "t_end": "2026-10-27T02:13:41.489704+00:00", + "planner": "fallback", + "model_id": null, + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"kind\":\"original_file\",\"message\":\"The file is strongly compressed and the flicker signal is weak. Please upload the original file.\"}", + "output_summary": "{\"request_id\":\"messaging_compression__s1100:original_file\",\"status\":\"open\"}", + "decision_reason": "B4: HIGH_COMPRESSION and weak signal", + "duration_s": 0.0248, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T02:13:41.490207+00:00", + "t_end": "2026-10-27T02:13:41.492242+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,62,23,46,54,47,36,39,12,22,55,37,44,17,38,45],\"ranked\":[{\"id\":63,\"score_db\":8.12},{\"id\":62,\"score_db\":8.09},{\"id\":23,\"score_db\":7.58},{\"id\":46,\"score_db\":7.05},{\"id\":54,\"score_db\":7.02},{\"id\":47,\"score_db\":6.91},{\"id\":36,\"score_db\":6.71},{\"id\":39,\"score_db\":6.63},{\"id\":12,\"score_db\":6.31},{\"id\":22,\"score_db\":6.2},{\"id\":55,\"score_db\":6.17},{\"id\":37,\"score_db\":5.98},{\"id\":44,\"score_db\":5.92},{\"id\":17,\"score_db\":5.82},{\"id\":38,\"score_db\":5.78},{\"id\":45,\"score_db\":5.72}],\"eligible\":64,\"total\":64}", + "decision_reason": "B1: signal weak (band SNR 5.865 dB); re-rank patches", + "duration_s": 0.002, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T02:13:41.495698+00:00", + "t_end": "2026-10-27T02:13:46.629922+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"patch_ids\":[63,62,23,46,54,47,36,39,12,22,55,37,44,17,38,45]}", + "output_summary": "{\"track_id\":\"t2\",\"band_snr_db\":4.169,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":99.96848,\"dft_peak_hz\":99.97057,\"estimators_agree\":true,\"reasons\":[\"SIGNAL_WEAK\"],\"candidates\":{\"rows+@100\":4.14}}", + "decision_reason": "B1: re-extract on the 16 highest-SNR patches", + "duration_s": 5.1342, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T02:13:46.872269+00:00", + "t_end": "2026-10-27T02:13:51.946638+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"patch_ids\":[63,62,23,46,54,47,36,39,12,22,55,37,44,17,38,45],\"nominal_hz\":60.0}", + "output_summary": "{\"track_id\":\"t3\",\"band_snr_db\":-0.802,\"axis\":\"rows+\",\"nominal_flicker_hz\":120.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":129.96876,\"dft_peak_hz\":118.62671,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@120\":-0.83}}", + "decision_reason": "B1: switch nominal frequency to 60 Hz", + "duration_s": 5.0744, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T02:13:52.055902+00:00", + "t_end": "2026-10-27T02:13:55.589663+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"patch_ids\":[63,62,23,46,54,47,36,39,12,22,55,37,44,17,38,45],\"axis\":\"cols+\"}", + "output_summary": "{\"track_id\":\"t4\",\"band_snr_db\":-5.252,\"axis\":\"cols+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":100.13104,\"dft_peak_hz\":99.97186,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"cols+@100\":-5.35}}", + "decision_reason": "B1: switch sensor axis to cols+", + "duration_s": 3.5338, + "error": null, + "policy_note": null + }, + { + "index": 10, + "t_start": "2026-10-27T02:13:55.593717+00:00", + "t_end": "2026-10-27T02:13:55.657133+00:00", + "planner": "fallback", + "model_id": null, + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"SIGNAL_WEAK\",\"READOUT_FROM_SIDECAR\",\"HIGH_COMPRESSION\",\"USER_INPUT_REQUESTED\"],\"rule\":\"S13.5\"}", + "decision_reason": "B5: no usable signal after the alternatives", + "duration_s": 0.0634, + "error": null, + "policy_note": null + }, + { + "index": 11, + "t_start": "2026-10-27T02:13:55.659140+00:00", + "t_end": "2026-10-27T02:15:43.763183+00:00", + "planner": "fallback", + "model_id": null, + "tool": "render_report", + "input_summary": "{\"job_id\":\"messaging_compression__s1100\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27\\\\synthetic-v1-fallback\\\\work\\\\messaging_compression__s1100\\\\overlay.mp4\",\"report_html\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27\\\\synthetic-v1-fallback\\\\work\\\\messaging_compression__s1100\\\\report.html\",\"report_pdf\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27\\\\synthetic-v1-fallback\\\\work\\\\messaging_compression__s1100\\\\report.pdf\",\"report_json\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27\\\\synthetic-v1-fallback\\\\work\\\\messaging_compression__s1100\\\\result.json\",\"plot...", + "decision_reason": "render report", + "duration_s": 108.104, + "error": null, + "policy_note": null + } + ] +} \ No newline at end of file diff --git a/results/agent_traces/no_mains_light__s1141.json b/results/agent_traces/no_mains_light__s1141.json new file mode 100644 index 0000000..4ffa0d5 --- /dev/null +++ b/results/agent_traces/no_mains_light__s1141.json @@ -0,0 +1,187 @@ +{ + "job_id": "no_mains_light__s1141", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:06:17.117465+00:00", + "t_end": "2026-10-27T04:06:26.832512+00:00", + "planner": "fallback", + "model_id": null, + "tool": "probe_video", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":1080,\"bitrate\":22606,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":true,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "start: read metadata and timing", + "duration_s": 9.715, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:06:26.834576+00:00", + "t_end": "2026-10-27T04:06:26.834576+00:00", + "planner": "fallback", + "model_id": null, + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "readout: sidecar, then profile, then blind", + "duration_s": 0.0, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:06:26.850509+00:00", + "t_end": "2026-10-27T04:08:33.652536+00:00", + "planner": "fallback", + "model_id": null, + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.0017,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"no_mains_light__s1141:normal\",\"segmentation\":\"model_unavailable\",\"low_motion_frames\":null}", + "decision_reason": "find static background", + "duration_s": 126.802, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:08:33.831075+00:00", + "t_end": "2026-10-27T04:08:56.594683+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":19,\"score_db\":-16.66},{\"id\":43,\"score_db\":-17.2},{\"id\":20,\"score_db\":-18.28},{\"id\":40,\"score_db\":-18.55},{\"id\":22,\"score_db\":-18.97},{\"id\":27,\"score_db\":-19.33},{\"id\":45,\"score_db\":-19.5},{\"id\":29,\"score_db\":-19.89},{\"id\":46,\"score_db\":-19.98},{\"id\":26,\"score_db\":-20.01},{\"id\":21,\"score_db\":-20.06},{\"id\":33,\"score_db\":-21.26},{\"id\":23,\"score_db\":-21.56},{\"id\":17,\"sc...", + "decision_reason": "rank light patches", + "duration_s": 22.7636, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:08:56.610025+00:00", + "t_end": "2026-10-27T04:09:03.284735+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":-11.665,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":93.35645,\"dft_peak_hz\":98.63735,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@100\":-12.9}}", + "decision_reason": "first extraction on all eligible patches", + "duration_s": 6.6747, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 5, + "t_start": "2026-10-27T04:09:03.292931+00:00", + "t_end": "2026-10-27T04:09:03.505182+00:00", + "planner": "fallback", + "model_id": null, + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"kind\":\"original_file\",\"message\":\"The file is strongly compressed and the flicker signal is weak. Please upload the original file.\"}", + "output_summary": "{\"request_id\":\"no_mains_light__s1141:original_file\",\"status\":\"open\"}", + "decision_reason": "B4: HIGH_COMPRESSION and weak signal", + "duration_s": 0.2123, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T04:09:03.509277+00:00", + "t_end": "2026-10-27T04:09:03.510311+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[19,43,20,40,22,27,45,29,46,26,21,33,23,17,42,30],\"ranked\":[{\"id\":19,\"score_db\":-16.66},{\"id\":43,\"score_db\":-17.2},{\"id\":20,\"score_db\":-18.28},{\"id\":40,\"score_db\":-18.55},{\"id\":22,\"score_db\":-18.97},{\"id\":27,\"score_db\":-19.33},{\"id\":45,\"score_db\":-19.5},{\"id\":29,\"score_db\":-19.89},{\"id\":46,\"score_db\":-19.98},{\"id\":26,\"score_db\":-20.01},{\"id\":21,\"score_db\":-20.06},{\"id\":33,\"score_db\":-21.26},{\"id\":23,\"score_db\":-21.56},{\"id\":17,\"score_db\":-21.62},{\"id\":42,\"score_db\":-21.97},{\"id\":30,\"score_db\":-22.04}],\"eligible\":64,\"total\":64}", + "decision_reason": "B1: signal weak (band SNR -11.665 dB); re-rank patches", + "duration_s": 0.001, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T04:09:03.529167+00:00", + "t_end": "2026-10-27T04:09:08.893254+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"patch_ids\":[19,43,20,40,22,27,45,29,46,26,21,33,23,17,42,30]}", + "output_summary": "{\"track_id\":\"t2\",\"band_snr_db\":-11.446,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":92.87637,\"dft_peak_hz\":100.5612,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@100\":-12.84}}", + "decision_reason": "B1: re-extract on the 16 highest-SNR patches", + "duration_s": 5.3641, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 8, + "t_start": "2026-10-27T04:09:08.897048+00:00", + "t_end": "2026-10-27T04:09:17.526800+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"patch_ids\":[19,43,20,40,22,27,45,29,46,26,21,33,23,17,42,30],\"nominal_hz\":60.0}", + "output_summary": "{\"track_id\":\"t3\",\"band_snr_db\":-9.712,\"axis\":\"rows+\",\"nominal_flicker_hz\":120.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":119.9004,\"dft_peak_hz\":118.55529,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@120\":-11.17}}", + "decision_reason": "B1: switch nominal frequency to 60 Hz", + "duration_s": 8.6298, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 9, + "t_start": "2026-10-27T04:09:17.613272+00:00", + "t_end": "2026-10-27T04:09:23.162110+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"patch_ids\":[19,43,20,40,22,27,45,29,46,26,21,33,23,17,42,30],\"nominal_hz\":50.0}", + "output_summary": "{\"track_id\":\"t4\",\"band_snr_db\":-11.446,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":92.87637,\"dft_peak_hz\":100.5612,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@100\":-12.84}}", + "decision_reason": "B1: switch nominal frequency to 50 Hz", + "duration_s": 5.5488, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 10, + "t_start": "2026-10-27T04:09:23.165642+00:00", + "t_end": "2026-10-27T04:09:28.579084+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"patch_ids\":[19,43,20,40,22,27,45,29,46,26,21,33,23,17,42,30],\"axis\":\"cols+\"}", + "output_summary": "{\"track_id\":\"t5\",\"band_snr_db\":-13.445,\"axis\":\"cols+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":92.96659,\"dft_peak_hz\":100.21183,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"cols+@100\":-14.88}}", + "decision_reason": "B1: switch sensor axis to cols+", + "duration_s": 5.4134, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 11, + "t_start": "2026-10-27T04:09:28.580106+00:00", + "t_end": "2026-10-27T04:09:28.614929+00:00", + "planner": "fallback", + "model_id": null, + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"SIGNAL_ABSENT\",\"READOUT_FROM_SIDECAR\",\"HIGH_COMPRESSION\",\"USER_INPUT_REQUESTED\"],\"rule\":\"S13.1\"}", + "decision_reason": "B5: no usable signal after the alternatives", + "duration_s": 0.0348, + "error": null, + "policy_note": null + }, + { + "index": 12, + "t_start": "2026-10-27T04:09:28.615949+00:00", + "t_end": "2026-10-27T04:10:38.464690+00:00", + "planner": "fallback", + "model_id": null, + "tool": "render_report", + "input_summary": "{\"job_id\":\"no_mains_light__s1141\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\no_mains_light__s1141\\\\overlay.mp4\",\"report_html\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\no_mains_light__s1141\\\\report.html\",\"report_pdf\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\no_mains_light__s1141\\\\report.pdf\",\"report_json\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\no_mains_light__s1141\\\\result.json\",\"plot_enf_tra...", + "decision_reason": "render report", + "duration_s": 69.8487, + "error": null, + "policy_note": null + } + ] +} \ No newline at end of file diff --git a/results/agent_traces/reorder__s1201.json b/results/agent_traces/reorder__s1201.json new file mode 100644 index 0000000..283f159 --- /dev/null +++ b/results/agent_traces/reorder__s1201.json @@ -0,0 +1,159 @@ +{ + "job_id": "reorder__s1201", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:15:32.295837+00:00", + "t_end": "2026-10-27T04:16:13.397582+00:00", + "planner": "fallback", + "model_id": null, + "tool": "probe_video", + "input_summary": "{\"job_id\":\"reorder__s1201\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2100,\"bitrate\":439085,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":2,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "start: read metadata and timing", + "duration_s": 41.1017, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:16:13.404661+00:00", + "t_end": "2026-10-27T04:16:13.409261+00:00", + "planner": "fallback", + "model_id": null, + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "readout: sidecar, then profile, then blind", + "duration_s": 0.0046, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:16:13.411271+00:00", + "t_end": "2026-10-27T04:18:16.400243+00:00", + "planner": "fallback", + "model_id": null, + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1191,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"reorder__s1201:normal\",\"segmentation\":\"model_unavailable\",\"low_motion_frames\":null}", + "decision_reason": "find static background", + "duration_s": 122.989, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:18:16.405345+00:00", + "t_end": "2026-10-27T04:18:42.194457+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":63,\"score_db\":20.56},{\"id\":39,\"score_db\":20.25},{\"id\":15,\"score_db\":19.95},{\"id\":61,\"score_db\":19.93},{\"id\":55,\"score_db\":19.74},{\"id\":52,\"score_db\":19.49},{\"id\":62,\"score_db\":19.4},{\"id\":13,\"score_db\":19.24},{\"id\":12,\"score_db\":19.22},{\"id\":54,\"score_db\":19.16},{\"id\":17,\"score_db\":19.15},{\"id\":53,\"score_db\":19.15},{\"id\":30,\"score_db\":19.09},{\"id\":31,\"score_db\":19.0...", + "decision_reason": "rank light patches", + "duration_s": 25.7891, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:18:42.207237+00:00", + "t_end": "2026-10-27T04:18:48.694993+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.025,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2100,\"track_samples\":66,\"mean_flicker_hz\":99.99845,\"dft_peak_hz\":99.9954,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.01}}", + "decision_reason": "first extraction on all eligible patches", + "duration_s": 6.4878, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 5, + "t_start": "2026-10-27T04:18:48.697014+00:00", + "t_end": "2026-10-27T04:18:49.584501+00:00", + "planner": "fallback", + "model_id": null, + "tool": "match_reference", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":false,\"best_offset_utc\":1768574642.1236339,\"rho1\":0.6547266275516092,\"rho2\":0.6287717961444808,\"margin\":0.025954831407128398,\"psr\":2.530934004305788,\"track_length_s\":69.0,\"time_uncertainty_s\":2.944705911068135,\"segments_consistent\":false,\"reasons\":[\"NO_UNIQUE_MATCH\",\"SEGMENT_OFFSET_INCONSISTENT\"]}", + "decision_reason": "signal usable (band SNR 11.025 dB); match against the reference", + "duration_s": 0.8875, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T04:18:49.586036+00:00", + "t_end": "2026-10-27T04:18:49.602893+00:00", + "planner": "fallback", + "model_id": null, + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[{\"kind\":\"EDIT_CANDIDATE\",\"frame_index\":77,\"t_s\":2.566666665999989,\"magnitude_rad\":-1.0417735851283663,\"significance\":26.41917969999762,\"significant\":true,\"gap_s\":null},{\"kind\":\"DROPPED_FRAMES_EXPLAINED\",\"frame_index\":90,\"t_s\":36.0,\"magnitude_rad\":NaN,\"significance\":0.0,\"significant\":false,\"gap_s\":33.000000001000004},{\"kind\":\"DROPPED_FRAMES_EXPLAINED\",\"frame_index\":1980,\"t_s\":66.0,\"magnitude_rad\":NaN,\"significance\":0.0,\"significant\":false,\"gap_s\":33.00000000099999}],\"edit_candidates\":1,\"dropped_explained\":2,\"reasons\":[\"EDIT_CANDIDATE\",\"DROPPED_FRAMES_EXPLAINED\"]}", + "decision_reason": "check phase continuity for edits", + "duration_s": 0.0169, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T04:18:49.604835+00:00", + "t_end": "2026-10-27T04:18:49.608105+00:00", + "planner": "fallback", + "model_id": null, + "tool": "face_region_check", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"status\":\"model_unavailable\",\"label\":\"EXPERIMENTAL\",\"ratio\":null,\"significance\":null,\"frames_with_faces\":0,\"anomaly\":false}", + "decision_reason": "experimental face-region check", + "duration_s": 0.0033, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:18:49.609742+00:00", + "t_end": "2026-10-27T04:18:49.619060+00:00", + "planner": "fallback", + "model_id": null, + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"reorder__s1201\"}", + "output_summary": "{\"verdict\":\"CONTRADICTED\",\"lifecycle_state\":\"PENDING_REVIEW\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"NO_UNIQUE_MATCH\",\"EDIT_CANDIDATE\",\"SEGMENT_OFFSET_INCONSISTENT\",\"DROPPED_FRAMES_EXPLAINED\"],\"rule\":\"S13.2\"}", + "decision_reason": "evidence complete; deterministic verdict", + "duration_s": 0.0093, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T04:18:49.620604+00:00", + "t_end": "2026-10-27T04:18:49.628307+00:00", + "planner": "fallback", + "model_id": null, + "tool": "request_human_review", + "input_summary": "{\"job_id\":\"reorder__s1201\"}", + "output_summary": "{\"review_id\":\"reorder__s1201\",\"status\":\"open\"}", + "decision_reason": "B6: verdict CONTRADICTED needs human approval", + "duration_s": 0.0077, + "error": null, + "policy_note": null + }, + { + "index": 10, + "t_start": "2026-10-27T04:18:49.629355+00:00", + "t_end": "2026-10-27T04:22:23.471066+00:00", + "planner": "fallback", + "model_id": null, + "tool": "render_report", + "input_summary": "{\"job_id\":\"reorder__s1201\",\"final\":false}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\reorder__s1201\\\\overlay.mp4\",\"report_html\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\reorder__s1201\\\\report.html\",\"report_pdf\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\reorder__s1201\\\\report.pdf\",\"report_json\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\reorder__s1201\\\\result.json\",\"plot_enf_track\":\"D:\\\\Open-cv\\\\.worktrees...", + "decision_reason": "render report as PENDING_REVIEW (B6)", + "duration_s": 213.8417, + "error": null, + "policy_note": null + } + ] +} \ No newline at end of file diff --git a/results/agent_traces/short_readout_long_expo__s1031.json b/results/agent_traces/short_readout_long_expo__s1031.json new file mode 100644 index 0000000..9ab5a19 --- /dev/null +++ b/results/agent_traces/short_readout_long_expo__s1031.json @@ -0,0 +1,173 @@ +{ + "job_id": "short_readout_long_expo__s1031", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T03:48:46.003350+00:00", + "t_end": "2026-10-27T03:49:03.077019+00:00", + "planner": "fallback", + "model_id": null, + "tool": "probe_video", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":1080,\"bitrate\":308992,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "start: read metadata and timing", + "duration_s": 17.0737, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T03:49:03.080064+00:00", + "t_end": "2026-10-27T03:49:03.081106+00:00", + "planner": "fallback", + "model_id": null, + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.012,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "readout: sidecar, then profile, then blind", + "duration_s": 0.001, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T03:49:03.082143+00:00", + "t_end": "2026-10-27T03:50:26.208237+00:00", + "planner": "fallback", + "model_id": null, + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1104,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"short_readout_long_expo__s1031:normal\",\"segmentation\":\"model_unavailable\",\"low_motion_frames\":null}", + "decision_reason": "find static background", + "duration_s": 83.1261, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T03:50:26.210278+00:00", + "t_end": "2026-10-27T03:50:49.954442+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":61,\"score_db\":9.78},{\"id\":63,\"score_db\":9.68},{\"id\":62,\"score_db\":9.6},{\"id\":60,\"score_db\":9.52},{\"id\":7,\"score_db\":9.39},{\"id\":56,\"score_db\":9.35},{\"id\":59,\"score_db\":9.3},{\"id\":6,\"score_db\":9.28},{\"id\":58,\"score_db\":9.27},{\"id\":4,\"score_db\":9.24},{\"id\":57,\"score_db\":9.2},{\"id\":5,\"score_db\":9.13},{\"id\":1,\"score_db\":9.11},{\"id\":0,\"score_db\":9.04},{\"id\":2,\"score_db\":...", + "decision_reason": "rank light patches", + "duration_s": 23.7442, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T03:50:50.081100+00:00", + "t_end": "2026-10-27T03:50:54.867704+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":2.509,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":100.00141,\"dft_peak_hz\":99.99928,\"estimators_agree\":true,\"reasons\":[\"SIGNAL_WEAK\"],\"candidates\":{\"rows+@100\":2.52}}", + "decision_reason": "first extraction on all eligible patches", + "duration_s": 4.7866, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 5, + "t_start": "2026-10-27T03:50:54.870235+00:00", + "t_end": "2026-10-27T03:50:54.872975+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[61,63,62,60,7,56,59,6,58,4,57,5,1,0,2,3],\"ranked\":[{\"id\":61,\"score_db\":9.78},{\"id\":63,\"score_db\":9.68},{\"id\":62,\"score_db\":9.6},{\"id\":60,\"score_db\":9.52},{\"id\":7,\"score_db\":9.39},{\"id\":56,\"score_db\":9.35},{\"id\":59,\"score_db\":9.3},{\"id\":6,\"score_db\":9.28},{\"id\":58,\"score_db\":9.27},{\"id\":4,\"score_db\":9.24},{\"id\":57,\"score_db\":9.2},{\"id\":5,\"score_db\":9.13},{\"id\":1,\"score_db\":9.11},{\"id\":0,\"score_db\":9.04},{\"id\":2,\"score_db\":9.01},{\"id\":3,\"score_db\":8.85}],\"eligible\":64,\"total\":64}", + "decision_reason": "B1: signal weak (band SNR 2.509 dB); re-rank patches", + "duration_s": 0.0027, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T03:50:54.880529+00:00", + "t_end": "2026-10-27T03:50:57.704543+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"patch_ids\":[61,63,62,60,7,56,59,6,58,4,57,5,1,0,2,3]}", + "output_summary": "{\"track_id\":\"t2\",\"band_snr_db\":8.992,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":100.26497,\"dft_peak_hz\":100.00113,\"estimators_agree\":false,\"reasons\":[],\"candidates\":{\"rows+@100\":9.0}}", + "decision_reason": "B1: re-extract on the 16 highest-SNR patches", + "duration_s": 2.824, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T03:50:57.706579+00:00", + "t_end": "2026-10-27T03:50:58.673946+00:00", + "planner": "fallback", + "model_id": null, + "tool": "match_reference", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"track_id\":\"t2\"}", + "output_summary": "{\"track_id\":\"t2\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768482526.8181486,\"rho1\":0.8156184371036445,\"rho2\":0.7993662869919208,\"margin\":0.01625215011172365,\"psr\":2.3588391524651677,\"track_length_s\":35.0,\"time_uncertainty_s\":1.7236201057677338,\"segments_consistent\":null,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "signal usable (band SNR 8.992 dB); match against the reference", + "duration_s": 0.9674, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T03:50:58.675978+00:00", + "t_end": "2026-10-27T03:50:58.678366+00:00", + "planner": "fallback", + "model_id": null, + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"track_id\":\"t2\"}", + "output_summary": "{\"track_id\":\"t2\",\"events\":[],\"edit_candidates\":0,\"dropped_explained\":0,\"reasons\":[]}", + "decision_reason": "check phase continuity for edits", + "duration_s": 0.0024, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T03:50:58.680396+00:00", + "t_end": "2026-10-27T03:50:58.684455+00:00", + "planner": "fallback", + "model_id": null, + "tool": "face_region_check", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"track_id\":\"t2\"}", + "output_summary": "{\"track_id\":\"t2\",\"status\":\"model_unavailable\",\"label\":\"EXPERIMENTAL\",\"ratio\":null,\"significance\":null,\"frames_with_faces\":0,\"anomaly\":false}", + "decision_reason": "experimental face-region check", + "duration_s": 0.0041, + "error": null, + "policy_note": null + }, + { + "index": 10, + "t_start": "2026-10-27T03:50:58.685972+00:00", + "t_end": "2026-10-27T03:51:06.778863+00:00", + "planner": "fallback", + "model_id": null, + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"MATCH_OK\"],\"rule\":\"S13.4\"}", + "decision_reason": "evidence complete; deterministic verdict", + "duration_s": 8.0929, + "error": null, + "policy_note": null + }, + { + "index": 11, + "t_start": "2026-10-27T03:51:06.778863+00:00", + "t_end": "2026-10-27T03:53:27.214909+00:00", + "planner": "fallback", + "model_id": null, + "tool": "render_report", + "input_summary": "{\"job_id\":\"short_readout_long_expo__s1031\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\short_readout_long_expo__s1031\\\\overlay.mp4\",\"report_html\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\short_readout_long_expo__s1031\\\\report.html\",\"report_pdf\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\short_readout_long_expo__s1031\\\\report.pdf\",\"report_json\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\short_readout_long_exp...", + "decision_reason": "render report", + "duration_s": 140.436, + "error": null, + "policy_note": null + } + ] +} \ No newline at end of file diff --git a/results/agent_traces/weak_flicker__s1021.json b/results/agent_traces/weak_flicker__s1021.json new file mode 100644 index 0000000..ceabff0 --- /dev/null +++ b/results/agent_traces/weak_flicker__s1021.json @@ -0,0 +1,159 @@ +{ + "job_id": "weak_flicker__s1021", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T03:48:46.426618+00:00", + "t_end": "2026-10-27T03:49:03.713167+00:00", + "planner": "fallback", + "model_id": null, + "tool": "probe_video", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":1080,\"bitrate\":144122,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "start: read metadata and timing", + "duration_s": 17.2865, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T03:49:03.715783+00:00", + "t_end": "2026-10-27T03:49:03.716295+00:00", + "planner": "fallback", + "model_id": null, + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "readout: sidecar, then profile, then blind", + "duration_s": 0.0005, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T03:49:03.717311+00:00", + "t_end": "2026-10-27T03:50:25.395333+00:00", + "planner": "fallback", + "model_id": null, + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1026,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"weak_flicker__s1021:normal\",\"segmentation\":\"model_unavailable\",\"low_motion_frames\":null}", + "decision_reason": "find static background", + "duration_s": 81.678, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T03:50:25.401911+00:00", + "t_end": "2026-10-27T03:50:46.715384+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":47,\"score_db\":3.03},{\"id\":39,\"score_db\":2.26},{\"id\":55,\"score_db\":2.18},{\"id\":62,\"score_db\":2.14},{\"id\":63,\"score_db\":2.1},{\"id\":15,\"score_db\":2.07},{\"id\":23,\"score_db\":1.87},{\"id\":14,\"score_db\":1.82},{\"id\":21,\"score_db\":1.82},{\"id\":38,\"score_db\":1.68},{\"id\":58,\"score_db\":1.43},{\"id\":30,\"score_db\":1.35},{\"id\":6,\"score_db\":1.34},{\"id\":20,\"score_db\":1.32},{\"id\":22,\"sc...", + "decision_reason": "rank light patches", + "duration_s": 21.3135, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T03:50:46.740509+00:00", + "t_end": "2026-10-27T03:50:52.727893+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":3.062,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":99.97926,\"dft_peak_hz\":99.97901,\"estimators_agree\":true,\"reasons\":[\"SIGNAL_WEAK\"],\"candidates\":{\"rows+@100\":3.17}}", + "decision_reason": "first extraction on all eligible patches", + "duration_s": 5.9874, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 5, + "t_start": "2026-10-27T03:50:52.738605+00:00", + "t_end": "2026-10-27T03:50:52.741630+00:00", + "planner": "fallback", + "model_id": null, + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[47,39,55,62,63,15,23,14,21,38,58,30,6,20,22,46],\"ranked\":[{\"id\":47,\"score_db\":3.03},{\"id\":39,\"score_db\":2.26},{\"id\":55,\"score_db\":2.18},{\"id\":62,\"score_db\":2.14},{\"id\":63,\"score_db\":2.1},{\"id\":15,\"score_db\":2.07},{\"id\":23,\"score_db\":1.87},{\"id\":14,\"score_db\":1.82},{\"id\":21,\"score_db\":1.82},{\"id\":38,\"score_db\":1.68},{\"id\":58,\"score_db\":1.43},{\"id\":30,\"score_db\":1.35},{\"id\":6,\"score_db\":1.34},{\"id\":20,\"score_db\":1.32},{\"id\":22,\"score_db\":1.31},{\"id\":46,\"score_db\":1.21}],\"eligible\":64,\"total\":64}", + "decision_reason": "B1: signal weak (band SNR 3.062 dB); re-rank patches", + "duration_s": 0.003, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T03:50:52.744586+00:00", + "t_end": "2026-10-27T03:50:56.087681+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"patch_ids\":[47,39,55,62,63,15,23,14,21,38,58,30,6,20,22,46]}", + "output_summary": "{\"track_id\":\"t2\",\"band_snr_db\":2.441,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":99.97926,\"dft_peak_hz\":99.97898,\"estimators_agree\":true,\"reasons\":[\"SIGNAL_WEAK\"],\"candidates\":{\"rows+@100\":2.36}}", + "decision_reason": "B1: re-extract on the 16 highest-SNR patches", + "duration_s": 3.3431, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T03:50:56.090416+00:00", + "t_end": "2026-10-27T03:50:59.371386+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"patch_ids\":[47,39,55,62,63,15,23,14,21,38,58,30,6,20,22,46],\"nominal_hz\":60.0}", + "output_summary": "{\"track_id\":\"t3\",\"band_snr_db\":-3.195,\"axis\":\"rows+\",\"nominal_flicker_hz\":120.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":129.84335,\"dft_peak_hz\":121.33605,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@120\":-3.21}}", + "decision_reason": "B1: switch nominal frequency to 60 Hz", + "duration_s": 3.281, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 8, + "t_start": "2026-10-27T03:50:59.373254+00:00", + "t_end": "2026-10-27T03:51:02.790747+00:00", + "planner": "fallback", + "model_id": null, + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"patch_ids\":[47,39,55,62,63,15,23,14,21,38,58,30,6,20,22,46],\"axis\":\"cols+\"}", + "output_summary": "{\"track_id\":\"t4\",\"band_snr_db\":-5.435,\"axis\":\"cols+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1080,\"track_samples\":32,\"mean_flicker_hz\":101.51517,\"dft_peak_hz\":99.97785,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"cols+@100\":-5.36}}", + "decision_reason": "B1: switch sensor axis to cols+", + "duration_s": 3.4175, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 9, + "t_start": "2026-10-27T03:51:02.792772+00:00", + "t_end": "2026-10-27T03:51:14.537269+00:00", + "planner": "fallback", + "model_id": null, + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"SIGNAL_WEAK\",\"READOUT_FROM_SIDECAR\"],\"rule\":\"S13.5\"}", + "decision_reason": "B5: no usable signal after the alternatives", + "duration_s": 11.7445, + "error": null, + "policy_note": null + }, + { + "index": 10, + "t_start": "2026-10-27T03:51:14.538932+00:00", + "t_end": "2026-10-27T03:52:54.703187+00:00", + "planner": "fallback", + "model_id": null, + "tool": "render_report", + "input_summary": "{\"job_id\":\"weak_flicker__s1021\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\weak_flicker__s1021\\\\overlay.mp4\",\"report_html\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\weak_flicker__s1021\\\\report.html\",\"report_pdf\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\weak_flicker__s1021\\\\report.pdf\",\"report_json\":\"D:\\\\Open-cv\\\\.worktrees\\\\docs\\\\results\\\\eval\\\\2026-10-27-test\\\\synthetic-v1-fallback\\\\work\\\\weak_flicker__s1021\\\\result.json\",\"plot_enf_track\":\"D:\\...", + "decision_reason": "render report", + "duration_s": 100.1643, + "error": null, + "policy_note": null + } + ] +} \ No newline at end of file diff --git a/results/aws/943b24f46a32/plots.json b/results/aws/943b24f46a32/plots.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/results/aws/943b24f46a32/plots.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/results/aws/943b24f46a32/report.html b/results/aws/943b24f46a32/report.html new file mode 100644 index 0000000..aa506ff --- /dev/null +++ b/results/aws/943b24f46a32/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report 943b24f46a32 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
INCONCLUSIVE
+
The analysis could not reach a result. This alone does not mean the video is fake.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)Not determined
Grid zoneNot determined
Reasons
  • USER_INPUT_REQUESTED — The analysis asked the user for more information.
+
+ +
+

Key plots

+ +
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash0161b96f77d3e925
Job943b24f46a32
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
verdict_ruleS13.5
+

Stage timings (s)

+
+
+
+ + \ No newline at end of file diff --git a/results/aws/943b24f46a32/report.pdf b/results/aws/943b24f46a32/report.pdf new file mode 100644 index 0000000..893531e Binary files /dev/null and b/results/aws/943b24f46a32/report.pdf differ diff --git a/results/aws/943b24f46a32/result.json b/results/aws/943b24f46a32/result.json new file mode 100644 index 0000000..adedb1a --- /dev/null +++ b/results/aws/943b24f46a32/result.json @@ -0,0 +1,34 @@ +{ + "job_id": "943b24f46a32", + "file_sha256": "", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "USER_INPUT_REQUESTED" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": null, + "continuity_events": [], + "face_region": null, + "quality": { + "verdict_rule": "S13.5", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S14_overlay": 0.0, + "S15_report": 0.6007 + }, + "artifacts": { + "report_html": "/app/work/jobs/943b24f46a32/report.html", + "report_pdf": "/app/work/jobs/943b24f46a32/report.pdf", + "report_json": "/app/work/jobs/943b24f46a32/result.json" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/943b24f46a32/trace.json b/results/aws/943b24f46a32/trace.json new file mode 100644 index 0000000..6951ba0 --- /dev/null +++ b/results/aws/943b24f46a32/trace.json @@ -0,0 +1,75 @@ +{ + "job_id": "943b24f46a32", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T05:19:00.826535+00:00", + "t_end": "2026-10-27T05:19:06.050476+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"943b24f46a32\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":3060,\"bitrate\":475500,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 5.2239, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T05:19:06.050801+00:00", + "t_end": "2026-10-27T05:19:10.559898+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"943b24f46a32\",\"method\":\"auto\"}", + "output_summary": "", + "decision_reason": "bedrock planner choice", + "duration_s": 4.5091, + "error": "Error executing tool estimate_readout: stage order: 'probe' is not available yet", + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T05:19:10.560219+00:00", + "t_end": "2026-10-27T05:19:11.139172+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"943b24f46a32\",\"kind\":\"camera_model\",\"message\":\"Readout time is unknown. Please give the camera model and video mode.\"}", + "output_summary": "{\"request_id\":\"943b24f46a32:camera_model\",\"status\":\"open\"}", + "decision_reason": "guard: planner proposed probe_video {} (identical call already made); fallback rule: B2: readout unknown after blind estimation", + "duration_s": 0.579, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T05:19:11.139490+00:00", + "t_end": "2026-10-27T05:19:12.423261+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"943b24f46a32\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"USER_INPUT_REQUESTED\"],\"rule\":\"S13.5\"}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 60, 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: B2: readout unknown; cannot model row timing", + "duration_s": 1.2838, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T05:19:12.423582+00:00", + "t_end": "2026-10-27T05:19:13.481829+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"943b24f46a32\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"report_html\":\"/app/work/jobs/943b24f46a32/report.html\",\"report_pdf\":\"/app/work/jobs/943b24f46a32/report.pdf\",\"report_json\":\"/app/work/jobs/943b24f46a32/result.json\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "policy: report must be rendered", + "duration_s": 1.0582, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws3-capture-verified-040158/band_amplitude.png b/results/aws/aws3-capture-verified-040158/band_amplitude.png new file mode 100644 index 0000000..4174d6c Binary files /dev/null and b/results/aws/aws3-capture-verified-040158/band_amplitude.png differ diff --git a/results/aws/aws3-capture-verified-040158/enf_track.png b/results/aws/aws3-capture-verified-040158/enf_track.png new file mode 100644 index 0000000..ad5799c Binary files /dev/null and b/results/aws/aws3-capture-verified-040158/enf_track.png differ diff --git a/results/aws/aws3-capture-verified-040158/ncc_scan.png b/results/aws/aws3-capture-verified-040158/ncc_scan.png new file mode 100644 index 0000000..dd21e67 Binary files /dev/null and b/results/aws/aws3-capture-verified-040158/ncc_scan.png differ diff --git a/results/aws/aws3-capture-verified-040158/phase_residual.png b/results/aws/aws3-capture-verified-040158/phase_residual.png new file mode 100644 index 0000000..deedce6 Binary files /dev/null and b/results/aws/aws3-capture-verified-040158/phase_residual.png differ diff --git a/results/aws/aws3-capture-verified-040158/plots.json b/results/aws/aws3-capture-verified-040158/plots.json new file mode 100644 index 0000000..725fc7b --- /dev/null +++ b/results/aws/aws3-capture-verified-040158/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "phase_residual.png", "alt": "Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.", "caption": "Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/aws3-capture-verified-040158/report.html b/results/aws/aws3-capture-verified-040158/report.html new file mode 100644 index 0000000..e504872 --- /dev/null +++ b/results/aws/aws3-capture-verified-040158/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report aws3-capture-verified-040158 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T10:00:00.020533+00:00 ± 1.5 s
Grid zoneSIM50
Reasons
  • READOUT_FROM_SIDECAR — Readout time came from the Capture sidecar.
  • MATCH_OK — The track matches the reference log at one time.
Matchpeak correlation 0.979, next peak 0.794, track length 69 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.
Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash5c105287d4e1c479
Jobaws3-capture-verified-040158
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db11.315922281294142
bitrate475816
bits_per_pixel0.2065173611111111
camera_motion_px0.0332642155899567
codech264
dft_peak_hz100.02935230815478
estimators_agreeTrue
foreground_fraction0.052797619047619045
frames2100
height240
jitter_p50_ms3.3302427482340136e-07
jitter_p95_ms3.3385298969790256e-07
motion_level_px0.1115635689380337
nominal_flicker_hz100.0
opencv_frame_count2100
phase_mean_flicker_hz100.02620440768338
readout_s0.025
readout_sourceREADOUT_FROM_SIDECAR
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcesensor
timing_assumptionsensor_timestamp_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.2939
S2_linear2.1477
S3_readout0.0
S4_motion6.4114
S5_segment0.9484
S7_rowsignal1.3298
S6_patches2.0457
S8_phase0.7744
S10_match0.7004
S11_continuity0.0009
+
+
+ + \ No newline at end of file diff --git a/results/aws/aws3-capture-verified-040158/report.pdf b/results/aws/aws3-capture-verified-040158/report.pdf new file mode 100644 index 0000000..60017a2 Binary files /dev/null and b/results/aws/aws3-capture-verified-040158/report.pdf differ diff --git a/results/aws/aws3-capture-verified-040158/result.json b/results/aws/aws3-capture-verified-040158/result.json new file mode 100644 index 0000000..ac36dd9 --- /dev/null +++ b/results/aws/aws3-capture-verified-040158/result.json @@ -0,0 +1,168 @@ +{ + "job_id": "aws3-capture-verified-040158", + "file_sha256": "b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "5c105287d4e1c479", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "time_estimate_utc": 1768903200.0205326, + "time_estimate_iso": "2026-01-20T10:00:00.020533+00:00", + "time_uncertainty_s": 1.5328837314983603, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768899600.0, + "window_end_utc": 1768906800.0, + "best_offset_utc": 1768903200.0205326, + "rho1": 0.9786120306875769, + "rho2": 0.7944010986559481, + "margin": 0.18421093203162875, + "psr": 3.063529487146239, + "track_length_s": 69.0, + "time_uncertainty_s": 1.5328837314983603, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.6960204, + "rho1": 0.9773509057903753, + "margin": 0.04668681624361348, + "passes": false + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.4487772, + "rho1": 0.9819621015376805, + "margin": 0.024282228683248808, + "passes": false + } + ], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2100, + "bitrate": 475816, + "bits_per_pixel": 0.2065173611111111, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "sensor", + "jitter_p50_ms": 3.3302427482340136e-07, + "jitter_p95_ms": 3.3385298969790256e-07, + "timing_assumption": "sensor_timestamp_is_first_row_exposure_start", + "opencv_frame_count": 2100, + "gaps": [], + "readout_s": 0.025, + "readout_source": "READOUT_FROM_SIDECAR", + "motion_level_px": 0.1115635689380337, + "camera_motion_px": 0.0332642155899567, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.052797619047619045, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 11.315922281294142, + "estimators_agree": true, + "dft_peak_hz": 100.02935230815478, + "phase_mean_flicker_hz": 100.02620440768338, + "patch_ids": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ], + "track_samples": 66, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.2939, + "S2_linear": 2.1477, + "S3_readout": 0.0, + "S4_motion": 6.4114, + "S5_segment": 0.9484, + "S7_rowsignal": 1.3298, + "S6_patches": 2.0457, + "S8_phase": 0.7744, + "S10_match": 0.7004, + "S11_continuity": 0.0009, + "S14_overlay": 37.9244, + "S15_report": 1.0994 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/aws3-capture-verified-040158/overlay.mp4", + "report_html": "/app/work/jobs/aws3-capture-verified-040158/report.html", + "report_pdf": "/app/work/jobs/aws3-capture-verified-040158/report.pdf", + "report_json": "/app/work/jobs/aws3-capture-verified-040158/result.json", + "plot_enf_track": "/app/work/jobs/aws3-capture-verified-040158/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/aws3-capture-verified-040158/ncc_scan.png", + "plot_phase_residual": "/app/work/jobs/aws3-capture-verified-040158/phase_residual.png", + "plot_band_amplitude": "/app/work/jobs/aws3-capture-verified-040158/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws3-capture-verified-040158/trace.json b/results/aws/aws3-capture-verified-040158/trace.json new file mode 100644 index 0000000..53d5fa8 --- /dev/null +++ b/results/aws/aws3-capture-verified-040158/trace.json @@ -0,0 +1,145 @@ +{ + "job_id": "aws3-capture-verified-040158", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:02:12.942393+00:00", + "t_end": "2026-10-27T04:02:16.092935+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2100,\"bitrate\":475816,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.1505, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:02:16.093269+00:00", + "t_end": "2026-10-27T04:02:16.569033+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.4758, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:02:16.570334+00:00", + "t_end": "2026-10-27T04:02:25.750652+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1116,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws3-capture-verified-040158:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.1803, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:02:25.751026+00:00", + "t_end": "2026-10-27T04:02:28.289063+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\":18.75},{\"id\":39,\"score_db\":18.67}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 2.538, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:02:28.289453+00:00", + "t_end": "2026-10-27T04:02:29.131745+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\"...", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [63, 53, 61, 62, 23, 15, 35, 37, 36, 31, 22, 29, 25, 30]} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 0.8423, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:02:29.132161+00:00", + "t_end": "2026-10-27T04:02:30.811115+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"patch_ids\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.316,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2100,\"track_samples\":66,\"mean_flicker_hz\":100.0262,\"dft_peak_hz\":100.02935,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.34}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [63, 53, 61, 62, 23, 15, 35, 37, 36, 31, 22, 29, 25, 30], 'axis': 'rows+', 'frame_subset': 'low_motion'} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 1.679, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T04:02:30.811545+00:00", + "t_end": "2026-10-27T04:02:32.058333+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903200.0205326,\"rho1\":0.9786120306875769,\"rho2\":0.7944010986559481,\"margin\":0.18421093203162875,\"psr\":3.063529487146239,\"track_length_s\":69.0,\"time_uncertainty_s\":1.5328837314983603,\"segments_consistent\":null,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.2468, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T04:02:32.058861+00:00", + "t_end": "2026-10-27T04:02:32.696013+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[],\"edit_candidates\":0,\"dropped_explained\":0,\"reasons\":[]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6372, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:02:32.696472+00:00", + "t_end": "2026-10-27T04:02:33.824796+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"MATCH_OK\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.1283, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T04:02:33.825266+00:00", + "t_end": "2026-10-27T04:03:13.329299+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"aws3-capture-verified-040158\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/aws3-capture-verified-040158/overlay.mp4\",\"report_html\":\"/app/work/jobs/aws3-capture-verified-040158/report.html\",\"report_pdf\":\"/app/work/jobs/aws3-capture-verified-040158/report.pdf\",\"report_json\":\"/app/work/jobs/aws3-capture-verified-040158/result.json\",\"plot_enf_track\":\"/app/work/jobs/aws3-capture-verified-040158/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/aws3-capture-verified-040158/ncc_scan.png\",\"plot_phase_residual\":\"/app/work/jobs/aws3-capture-verified-040158/phase_residual.png\",\"plot_band_amplitude\":\"/app/work/jobs/aws3-capture-verifie...", + "decision_reason": "policy: report must be rendered", + "duration_s": 39.504, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws3-cut-1s-040211/band_amplitude.png b/results/aws/aws3-cut-1s-040211/band_amplitude.png new file mode 100644 index 0000000..5ff563b Binary files /dev/null and b/results/aws/aws3-cut-1s-040211/band_amplitude.png differ diff --git a/results/aws/aws3-cut-1s-040211/enf_track.png b/results/aws/aws3-cut-1s-040211/enf_track.png new file mode 100644 index 0000000..7ee01ef Binary files /dev/null and b/results/aws/aws3-cut-1s-040211/enf_track.png differ diff --git a/results/aws/aws3-cut-1s-040211/ncc_scan.png b/results/aws/aws3-cut-1s-040211/ncc_scan.png new file mode 100644 index 0000000..b5723c2 Binary files /dev/null and b/results/aws/aws3-cut-1s-040211/ncc_scan.png differ diff --git a/results/aws/aws3-cut-1s-040211/phase_residual.png b/results/aws/aws3-cut-1s-040211/phase_residual.png new file mode 100644 index 0000000..c39aef5 Binary files /dev/null and b/results/aws/aws3-cut-1s-040211/phase_residual.png differ diff --git a/results/aws/aws3-cut-1s-040211/plots.json b/results/aws/aws3-cut-1s-040211/plots.json new file mode 100644 index 0000000..725fc7b --- /dev/null +++ b/results/aws/aws3-cut-1s-040211/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "phase_residual.png", "alt": "Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.", "caption": "Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/aws3-cut-1s-040211/report.html b/results/aws/aws3-cut-1s-040211/report.html new file mode 100644 index 0000000..ab6ad34 --- /dev/null +++ b/results/aws/aws3-cut-1s-040211/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report aws3-cut-1s-040211 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T10:00:00.469923+00:00 ± 1.6 s
Grid zoneSIM50
Reasons
  • READOUT_ESTIMATED — Readout time was estimated from the video (lower confidence).
  • MATCH_OK — The track matches the reference log at one time.
  • CLAIM_TIME_MATCH — The matched time agrees with the claimed time.
Matchpeak correlation 0.932, next peak 0.776, track length 68 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.
Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256d3bae5ec5c6bd5b06af56990a213e435af44e659a5468937053efb4380f4d2db
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash5c105287d4e1c479
Jobaws3-cut-1s-040211
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db11.374746290115677
bitrate477539
bits_per_pixel0.20726519097222224
camera_motion_px0.033711360290670817
codech264
dft_peak_hz100.03024567608703
estimators_agreeTrue
foreground_fraction0.05245036986714976
frames2070
height240
jitter_p50_ms7.105427357601002e-12
jitter_p95_ms2.042810365310288e-11
motion_level_px0.11003735380219795
nominal_flicker_hz100.0
opencv_frame_count2070
phase_mean_flicker_hz100.0266658732615
readout_s0.025285470085468713
readout_sourceREADOUT_ESTIMATED
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcepts
timing_assumptionpts_is_first_row_exposure_start
track_idt1
track_samples65
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.2943
S2_linear2.1275
S7_rowsignal2.5627
S3_readout4.4826
S4_motion6.3767
S5_segment0.9469
S6_patches3.2888
S8_phase2.4554
S10_match0.2329
S11_continuity0.001
+
+
+ + \ No newline at end of file diff --git a/results/aws/aws3-cut-1s-040211/report.pdf b/results/aws/aws3-cut-1s-040211/report.pdf new file mode 100644 index 0000000..203f97a Binary files /dev/null and b/results/aws/aws3-cut-1s-040211/report.pdf differ diff --git a/results/aws/aws3-cut-1s-040211/result.json b/results/aws/aws3-cut-1s-040211/result.json new file mode 100644 index 0000000..4914917 --- /dev/null +++ b/results/aws/aws3-cut-1s-040211/result.json @@ -0,0 +1,169 @@ +{ + "job_id": "aws3-cut-1s-040211", + "file_sha256": "d3bae5ec5c6bd5b06af56990a213e435af44e659a5468937053efb4380f4d2db", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "5c105287d4e1c479", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK", + "CLAIM_TIME_MATCH" + ], + "time_estimate_utc": 1768903200.469923, + "time_estimate_iso": "2026-01-20T10:00:00.469923+00:00", + "time_uncertainty_s": 1.6447693183164978, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768902600.0, + "window_end_utc": 1768903800.0, + "best_offset_utc": 1768903200.469923, + "rho1": 0.9319864761239409, + "rho2": 0.7756557618917911, + "margin": 0.15633071423214984, + "psr": 3.036660335338008, + "track_length_s": 68.0, + "time_uncertainty_s": 1.6447693183164978, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.8298001, + "rho1": 0.9558312572794839, + "margin": 0.09847077979419394, + "passes": false + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.9613702, + "rho1": 0.9672877178022941, + "margin": 0.054846465613024975, + "passes": false + } + ], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2070, + "bitrate": 477539, + "bits_per_pixel": 0.20726519097222224, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "pts", + "jitter_p50_ms": 7.105427357601002e-12, + "jitter_p95_ms": 2.042810365310288e-11, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 2070, + "gaps": [], + "readout_s": 0.025285470085468713, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 0.11003735380219795, + "camera_motion_px": 0.033711360290670817, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.05245036986714976, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 11.374746290115677, + "estimators_agree": true, + "dft_peak_hz": 100.03024567608703, + "phase_mean_flicker_hz": 100.0266658732615, + "patch_ids": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ], + "track_samples": 65, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.2943, + "S2_linear": 2.1275, + "S7_rowsignal": 2.5627, + "S3_readout": 4.4826, + "S4_motion": 6.3767, + "S5_segment": 0.9469, + "S6_patches": 3.2888, + "S8_phase": 2.4554, + "S10_match": 0.2329, + "S11_continuity": 0.001, + "S14_overlay": 36.5538, + "S15_report": 1.1319 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/aws3-cut-1s-040211/overlay.mp4", + "report_html": "/app/work/jobs/aws3-cut-1s-040211/report.html", + "report_pdf": "/app/work/jobs/aws3-cut-1s-040211/report.pdf", + "report_json": "/app/work/jobs/aws3-cut-1s-040211/result.json", + "plot_enf_track": "/app/work/jobs/aws3-cut-1s-040211/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/aws3-cut-1s-040211/ncc_scan.png", + "plot_phase_residual": "/app/work/jobs/aws3-cut-1s-040211/phase_residual.png", + "plot_band_amplitude": "/app/work/jobs/aws3-cut-1s-040211/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws3-cut-1s-040211/trace.json b/results/aws/aws3-cut-1s-040211/trace.json new file mode 100644 index 0000000..96d7875 --- /dev/null +++ b/results/aws/aws3-cut-1s-040211/trace.json @@ -0,0 +1,145 @@ +{ + "job_id": "aws3-cut-1s-040211", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:03:17.054598+00:00", + "t_end": "2026-10-27T04:03:20.143168+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2070,\"bitrate\":477539,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.0886, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:03:20.143480+00:00", + "t_end": "2026-10-27T04:03:25.160103+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025285470085468713,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.9317,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 5.0166, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:03:25.161422+00:00", + "t_end": "2026-10-27T04:03:34.282669+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.11,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws3-cut-1s-040211:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.1212, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:03:34.283025+00:00", + "t_end": "2026-10-27T04:03:38.051382+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[35,37,23,36,53,31,30,15,25,29,39,34,28,22],\"ranked\":[{\"id\":35,\"score_db\":19.52},{\"id\":37,\"score_db\":19.45},{\"id\":23,\"score_db\":19.42},{\"id\":36,\"score_db\":19.38},{\"id\":53,\"score_db\":19.35},{\"id\":31,\"score_db\":19.28},{\"id\":30,\"score_db\":19.18},{\"id\":15,\"score_db\":19.01},{\"id\":25,\"score_db\":19.01},{\"id\":29,\"score_db\":18.96},{\"id\":39,\"score_db\":18.88},{\"id\":34,\"score_db\":18.74},{\"id\":28,\"score_db\":18.67},{\"id\":22,\"score_db\":18.64},{\"id\":43,\"score_db\":18.56},{\"id\":17,\"score_db\":18.45}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.7684, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:03:38.052814+00:00", + "t_end": "2026-10-27T04:03:38.933532+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":35,\"score_db\":19.52},{\"id\":37,\"score_db\":19.45},{\"id\":23,\"score_db\":19.42},{\"id\":36,\"score_db\":19.38},{\"id\":53,\"score_db\":19.35},{\"id\":31,\"score_db\":19.28},{\"id\":30,\"score_db\":19.18},{\"id\":15,\"score_db\":19.01},{\"id\":25,\"score_db\":19.01},{\"id\":29,\"score_db\":18.96},{\"id\":39,\"score_db\":18.88},{\"id\":34,\"score_db\":18.74},{\"id\":28,\"score_db\":18.67},{\"id\":22,\"score_db\":18.64},{\"id\":43,\"score_d...", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 60, 'patch_ids': [35, 37, 23, 36, 53, 31, 30, 15, 25, 29, 39, 34, 28, 22], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 0.8807, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:03:38.933938+00:00", + "t_end": "2026-10-27T04:03:42.266855+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"patch_ids\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.375,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2070,\"track_samples\":65,\"mean_flicker_hz\":100.02667,\"dft_peak_hz\":100.03025,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.4,\"cols+@100\":-7.41,\"cols-@100\":-7.41,\"rows-@100\":11.4}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [35, 37, 23, 36, 53, 31, 30, 15, 25, 29, 39, 34, 28, 22], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 3.3329, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T04:03:42.267294+00:00", + "t_end": "2026-10-27T04:03:42.955241+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903200.469923,\"rho1\":0.9319864761239409,\"rho2\":0.7756557618917911,\"margin\":0.15633071423214984,\"psr\":3.036660335338008,\"track_length_s\":68.0,\"time_uncertainty_s\":1.6447693183164978,\"segments_consistent\":null,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6879, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T04:03:42.955676+00:00", + "t_end": "2026-10-27T04:03:43.437777+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[],\"edit_candidates\":0,\"dropped_explained\":0,\"reasons\":[]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.4821, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:03:43.439329+00:00", + "t_end": "2026-10-27T04:03:44.293465+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_ESTIMATED\",\"MATCH_OK\",\"CLAIM_TIME_MATCH\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.8541, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T04:03:44.293916+00:00", + "t_end": "2026-10-27T04:04:22.593613+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"aws3-cut-1s-040211\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/aws3-cut-1s-040211/overlay.mp4\",\"report_html\":\"/app/work/jobs/aws3-cut-1s-040211/report.html\",\"report_pdf\":\"/app/work/jobs/aws3-cut-1s-040211/report.pdf\",\"report_json\":\"/app/work/jobs/aws3-cut-1s-040211/result.json\",\"plot_enf_track\":\"/app/work/jobs/aws3-cut-1s-040211/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/aws3-cut-1s-040211/ncc_scan.png\",\"plot_phase_residual\":\"/app/work/jobs/aws3-cut-1s-040211/phase_residual.png\",\"plot_band_amplitude\":\"/app/work/jobs/aws3-cut-1s-040211/band_amplitude.png\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "policy: report must be rendered", + "duration_s": 38.2997, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws3-dropped-frames-040218/band_amplitude.png b/results/aws/aws3-dropped-frames-040218/band_amplitude.png new file mode 100644 index 0000000..bd7aabb Binary files /dev/null and b/results/aws/aws3-dropped-frames-040218/band_amplitude.png differ diff --git a/results/aws/aws3-dropped-frames-040218/enf_track.png b/results/aws/aws3-dropped-frames-040218/enf_track.png new file mode 100644 index 0000000..0b4d101 Binary files /dev/null and b/results/aws/aws3-dropped-frames-040218/enf_track.png differ diff --git a/results/aws/aws3-dropped-frames-040218/ncc_scan.png b/results/aws/aws3-dropped-frames-040218/ncc_scan.png new file mode 100644 index 0000000..7715672 Binary files /dev/null and b/results/aws/aws3-dropped-frames-040218/ncc_scan.png differ diff --git a/results/aws/aws3-dropped-frames-040218/phase_residual.png b/results/aws/aws3-dropped-frames-040218/phase_residual.png new file mode 100644 index 0000000..fa96e0d Binary files /dev/null and b/results/aws/aws3-dropped-frames-040218/phase_residual.png differ diff --git a/results/aws/aws3-dropped-frames-040218/plots.json b/results/aws/aws3-dropped-frames-040218/plots.json new file mode 100644 index 0000000..725fc7b --- /dev/null +++ b/results/aws/aws3-dropped-frames-040218/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "phase_residual.png", "alt": "Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.", "caption": "Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/aws3-dropped-frames-040218/report.html b/results/aws/aws3-dropped-frames-040218/report.html new file mode 100644 index 0000000..e146425 --- /dev/null +++ b/results/aws/aws3-dropped-frames-040218/report.html @@ -0,0 +1,95 @@ + + + + + +GRIDPRINT report aws3-dropped-frames-040218 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T10:00:00.014252+00:00 ± 1.5 s
Grid zoneSIM50
Reasons
  • READOUT_FROM_SIDECAR — Readout time came from the Capture sidecar.
  • MATCH_OK — The track matches the reference log at one time.
  • DROPPED_FRAMES_EXPLAINED — Frame gaps were found; the flicker phase across them is consistent (not an edit).
Matchpeak correlation 0.980, next peak 0.784, track length 69 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.
Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-25697bd81ea29c2a33b16465d912f7ac4e526a0425b1cc54b33e27aeb10b46074b9
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash5c105287d4e1c479
Jobaws3-dropped-frames-040218
+
+ +
+

Appendix

+

Continuity events

+ +
KindTime in video (s)Phase jump (rad)Significance
DROPPED_FRAMES_EXPLAINED20.20-0.0330.6
DROPPED_FRAMES_EXPLAINED43.630.0200.3
+ +

Quality metrics

+
axisrows+
band_snr_db11.426580954399864
bitrate490747
bits_per_pixel0.21453018834932053
camera_motion_px0.032422965009069944
codech264
dft_peak_hz100.02934814260769
estimators_agreeTrue
foreground_fraction0.052121927458033575
frames2085
height240
jitter_p50_ms3.3305269653283176e-07
jitter_p95_ms3.338056941970535e-07
motion_level_px0.10989784047152439
nominal_flicker_hz100.0
opencv_frame_count2085
phase_mean_flicker_hz100.0261382279723
readout_s0.025
readout_sourceREADOUT_FROM_SIDECAR
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcesensor
timing_assumptionsensor_timestamp_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.2987
S2_linear2.1473
S3_readout0.0
S4_motion6.429
S5_segment0.9464
S7_rowsignal1.3119
S6_patches1.5387
S8_phase0.7588
S10_match0.6712
S11_continuity0.0009
+
+
+ + \ No newline at end of file diff --git a/results/aws/aws3-dropped-frames-040218/report.pdf b/results/aws/aws3-dropped-frames-040218/report.pdf new file mode 100644 index 0000000..6604190 Binary files /dev/null and b/results/aws/aws3-dropped-frames-040218/report.pdf differ diff --git a/results/aws/aws3-dropped-frames-040218/result.json b/results/aws/aws3-dropped-frames-040218/result.json new file mode 100644 index 0000000..af44847 --- /dev/null +++ b/results/aws/aws3-dropped-frames-040218/result.json @@ -0,0 +1,199 @@ +{ + "job_id": "aws3-dropped-frames-040218", + "file_sha256": "97bd81ea29c2a33b16465d912f7ac4e526a0425b1cc54b33e27aeb10b46074b9", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "5c105287d4e1c479", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "DROPPED_FRAMES_EXPLAINED" + ], + "time_estimate_utc": 1768903200.0142524, + "time_estimate_iso": "2026-01-20T10:00:00.014252+00:00", + "time_uncertainty_s": 1.5405208068860503, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768899600.0, + "window_end_utc": 1768906800.0, + "best_offset_utc": 1768903200.0142524, + "rho1": 0.9800703970913697, + "rho2": 0.7844111609436265, + "margin": 0.19565923614774317, + "psr": 3.0627806275890603, + "track_length_s": 69.0, + "time_uncertainty_s": 1.5405208068860503, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.6992779, + "rho1": 0.9789072475146381, + "margin": 0.04652485261357009, + "passes": false + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.3011754, + "rho1": 0.9859480845233223, + "margin": 0.02264086404046306, + "passes": false + } + ], + "segments_consistent": null + }, + "continuity_events": [ + { + "kind": "DROPPED_FRAMES_EXPLAINED", + "frame_index": 600, + "t_s": 20.19999999999999, + "magnitude_rad": -0.03309346827316251, + "significance": 0.6125052027153908, + "significant": false, + "gap_s": 0.20000000100000648 + }, + { + "kind": "DROPPED_FRAMES_EXPLAINED", + "frame_index": 1294, + "t_s": 43.633333332999996, + "magnitude_rad": 0.01958448362225873, + "significance": 0.2912458143353985, + "significant": false, + "gap_s": 0.30000000000001137 + } + ], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2085, + "bitrate": 490747, + "bits_per_pixel": 0.21453018834932053, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "sensor", + "jitter_p50_ms": 3.3305269653283176e-07, + "jitter_p95_ms": 3.338056941970535e-07, + "timing_assumption": "sensor_timestamp_is_first_row_exposure_start", + "opencv_frame_count": 2085, + "gaps": [ + { + "frame_index": 600, + "t_s": 20.19999999999999, + "size_s": 0.20000000100000648 + }, + { + "frame_index": 1294, + "t_s": 43.633333332999996, + "size_s": 0.30000000000001137 + } + ], + "readout_s": 0.025, + "readout_source": "READOUT_FROM_SIDECAR", + "motion_level_px": 0.10989784047152439, + "camera_motion_px": 0.032422965009069944, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.052121927458033575, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 11.426580954399864, + "estimators_agree": true, + "dft_peak_hz": 100.02934814260769, + "phase_mean_flicker_hz": 100.0261382279723, + "patch_ids": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ], + "track_samples": 66, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.2987, + "S2_linear": 2.1473, + "S3_readout": 0.0, + "S4_motion": 6.429, + "S5_segment": 0.9464, + "S7_rowsignal": 1.3119, + "S6_patches": 1.5387, + "S8_phase": 0.7588, + "S10_match": 0.6712, + "S11_continuity": 0.0009, + "S14_overlay": 36.9424, + "S15_report": 1.0727 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/aws3-dropped-frames-040218/overlay.mp4", + "report_html": "/app/work/jobs/aws3-dropped-frames-040218/report.html", + "report_pdf": "/app/work/jobs/aws3-dropped-frames-040218/report.pdf", + "report_json": "/app/work/jobs/aws3-dropped-frames-040218/result.json", + "plot_enf_track": "/app/work/jobs/aws3-dropped-frames-040218/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/aws3-dropped-frames-040218/ncc_scan.png", + "plot_phase_residual": "/app/work/jobs/aws3-dropped-frames-040218/phase_residual.png", + "plot_band_amplitude": "/app/work/jobs/aws3-dropped-frames-040218/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws3-dropped-frames-040218/trace.json b/results/aws/aws3-dropped-frames-040218/trace.json new file mode 100644 index 0000000..9e1e9cc --- /dev/null +++ b/results/aws/aws3-dropped-frames-040218/trace.json @@ -0,0 +1,145 @@ +{ + "job_id": "aws3-dropped-frames-040218", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:04:26.063151+00:00", + "t_end": "2026-10-27T04:04:29.181575+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2085,\"bitrate\":490747,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":2,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.1184, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:04:29.181890+00:00", + "t_end": "2026-10-27T04:04:29.629989+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.4481, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:04:29.630804+00:00", + "t_end": "2026-10-27T04:04:38.929276+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1099,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws3-dropped-frames-040218:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.2985, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:04:38.929625+00:00", + "t_end": "2026-10-27T04:04:41.037495+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,62,61,23,15,37,35,36,31,29,25,22,30],\"ranked\":[{\"id\":63,\"score_db\":20.59},{\"id\":53,\"score_db\":20.07},{\"id\":62,\"score_db\":19.68},{\"id\":61,\"score_db\":19.66},{\"id\":23,\"score_db\":19.52},{\"id\":15,\"score_db\":19.52},{\"id\":37,\"score_db\":19.36},{\"id\":35,\"score_db\":19.33},{\"id\":36,\"score_db\":19.24},{\"id\":31,\"score_db\":19.13},{\"id\":29,\"score_db\":19.06},{\"id\":25,\"score_db\":19.01},{\"id\":22,\"score_db\":18.96},{\"id\":30,\"score_db\":18.89},{\"id\":54,\"score_db\":18.84},{\"id\":10,\"score_db\":18.8}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 2.1079, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:04:41.037881+00:00", + "t_end": "2026-10-27T04:04:41.793864+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":63,\"score_db\":20.59},{\"id\":53,\"score_db\":20.07},{\"id\":62,\"score_db\":19.68},{\"id\":61,\"score_db\":19.66},{\"id\":23,\"score_db\":19.52},{\"id\":15,\"score_db\":19.52},{\"id\":37,\"score_db\":19.36},{\"id\":35,\"score_db\":19.33},{\"id\":36,\"score_db\":19.24},{\"id\":31,\"score_db\":19.13},{\"id\":29,\"score_db\":19.06},{\"id\":25,\"score_db\":19.01},{\"id\":22,\"score_db\":18.96},{\"id\":30,\"score_db\":18.89},{\"id\":54,\"score_d...", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 60, 'patch_ids': [63, 53, 62, 61, 23, 15, 37, 35, 36, 31, 29, 25, 22, 30], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 0.756, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:04:41.794260+00:00", + "t_end": "2026-10-27T04:04:43.391909+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"patch_ids\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.427,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2085,\"track_samples\":66,\"mean_flicker_hz\":100.02614,\"dft_peak_hz\":100.02935,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.46}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [63, 53, 62, 61, 23, 15, 37, 35, 36, 31, 29, 25, 22, 30], 'axis': 'rows+', 'frame_subset': 'low_motion'} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 1.5976, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T04:04:43.392328+00:00", + "t_end": "2026-10-27T04:04:44.617044+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903200.0142524,\"rho1\":0.9800703970913697,\"rho2\":0.7844111609436265,\"margin\":0.19565923614774317,\"psr\":3.0627806275890603,\"track_length_s\":69.0,\"time_uncertainty_s\":1.5405208068860503,\"segments_consistent\":null,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.2247, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T04:04:44.617492+00:00", + "t_end": "2026-10-27T04:04:45.092234+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[{\"kind\":\"DROPPED_FRAMES_EXPLAINED\",\"frame_index\":600,\"t_s\":20.19999999999999,\"magnitude_rad\":-0.03309346827316251,\"significance\":0.6125052027153908,\"significant\":false,\"gap_s\":0.20000000100000648},{\"kind\":\"DROPPED_FRAMES_EXPLAINED\",\"frame_index\":1294,\"t_s\":43.633333332999996,\"magnitude_rad\":0.01958448362225873,\"significance\":0.2912458143353985,\"significant\":false,\"gap_s\":0.30000000000001137}],\"edit_candidates\":0,\"dropped_explained\":2,\"reasons\":[\"DROPPED_FRAMES_EXPLAINED\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.4747, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:04:45.092689+00:00", + "t_end": "2026-10-27T04:04:45.799306+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"MATCH_OK\",\"DROPPED_FRAMES_EXPLAINED\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.7066, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T04:04:45.799771+00:00", + "t_end": "2026-10-27T04:05:24.256855+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"aws3-dropped-frames-040218\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/aws3-dropped-frames-040218/overlay.mp4\",\"report_html\":\"/app/work/jobs/aws3-dropped-frames-040218/report.html\",\"report_pdf\":\"/app/work/jobs/aws3-dropped-frames-040218/report.pdf\",\"report_json\":\"/app/work/jobs/aws3-dropped-frames-040218/result.json\",\"plot_enf_track\":\"/app/work/jobs/aws3-dropped-frames-040218/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/aws3-dropped-frames-040218/ncc_scan.png\",\"plot_phase_residual\":\"/app/work/jobs/aws3-dropped-frames-040218/phase_residual.png\",\"plot_band_amplitude\":\"/app/work/jobs/aws3-dropped-frames-040218/band_am...", + "decision_reason": "policy: report must be rendered", + "duration_s": 38.4571, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws4-agent-recovery-041816/band_amplitude.png b/results/aws/aws4-agent-recovery-041816/band_amplitude.png new file mode 100644 index 0000000..89e44e3 Binary files /dev/null and b/results/aws/aws4-agent-recovery-041816/band_amplitude.png differ diff --git a/results/aws/aws4-agent-recovery-041816/enf_track.png b/results/aws/aws4-agent-recovery-041816/enf_track.png new file mode 100644 index 0000000..07e73d1 Binary files /dev/null and b/results/aws/aws4-agent-recovery-041816/enf_track.png differ diff --git a/results/aws/aws4-agent-recovery-041816/plots.json b/results/aws/aws4-agent-recovery-041816/plots.json new file mode 100644 index 0000000..2ef1972 --- /dev/null +++ b/results/aws/aws4-agent-recovery-041816/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/aws4-agent-recovery-041816/report.html b/results/aws/aws4-agent-recovery-041816/report.html new file mode 100644 index 0000000..c3cfa90 --- /dev/null +++ b/results/aws/aws4-agent-recovery-041816/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report aws4-agent-recovery-041816 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
INCONCLUSIVE
+
The analysis could not reach a result. This alone does not mean the video is fake.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)Not determined
Grid zoneNot determined
Reasons
  • READOUT_ESTIMATED — Readout time was estimated from the video (lower confidence).
  • NO_REFERENCE_COVERAGE — No reference grid data covers the search window.
Matchpeak correlation n/a, next peak n/a, track length 0 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256f98cd7056f8223dfc1827d61a8c86df5b275e6344c2a3fb2ace08d31c0795190
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash0161b96f77d3e925
Jobaws4-agent-recovery-041816
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db7.539332816617346
bitrate1306717
bits_per_pixel0.5671514756944445
camera_motion_px0.047522756356948116
codech264
dft_peak_hz100.02497834462315
estimators_agreeTrue
foreground_fraction0.00021595982142857143
frames2100
height240
jitter_p50_ms1.4210854715202004e-11
jitter_p95_ms2.8421709430404007e-11
motion_level_px0.1766870852657624
nominal_flicker_hz100.0
opencv_frame_count2100
phase_mean_flicker_hz100.02740075286172
readout_s0.025285470085468713
readout_sourceREADOUT_ESTIMATED
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcepts
timing_assumptionpts_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.5
width320
+

Stage timings (s)

+
S1_ingest0.5777
S2_linear2.4379
S7_rowsignal2.6242
S3_readout7.8005
S4_motion6.744
S5_segment0.9506
S6_patches5.5234
S8_phase4.6962
S10_match0.1805
+
+
+ + \ No newline at end of file diff --git a/results/aws/aws4-agent-recovery-041816/report.pdf b/results/aws/aws4-agent-recovery-041816/report.pdf new file mode 100644 index 0000000..548a189 Binary files /dev/null and b/results/aws/aws4-agent-recovery-041816/report.pdf differ diff --git a/results/aws/aws4-agent-recovery-041816/result.json b/results/aws/aws4-agent-recovery-041816/result.json new file mode 100644 index 0000000..c09dddf --- /dev/null +++ b/results/aws/aws4-agent-recovery-041816/result.json @@ -0,0 +1,108 @@ +{ + "job_id": "aws4-agent-recovery-041816", + "file_sha256": "f98cd7056f8223dfc1827d61a8c86df5b275e6344c2a3fb2ace08d31c0795190", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_REFERENCE_COVERAGE" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": { + "zone": "unknown", + "window_start_utc": 0.0, + "window_end_utc": 0.0, + "best_offset_utc": null, + "rho1": null, + "rho2": null, + "margin": null, + "psr": null, + "track_length_s": 0.0, + "time_uncertainty_s": null, + "passes": false, + "segments": [], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2100, + "bitrate": 1306717, + "bits_per_pixel": 0.5671514756944445, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "pts", + "jitter_p50_ms": 1.4210854715202004e-11, + "jitter_p95_ms": 2.8421709430404007e-11, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 2100, + "gaps": [], + "readout_s": 0.025285470085468713, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 0.1766870852657624, + "camera_motion_px": 0.047522756356948116, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.00021595982142857143, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 7.539332816617346, + "estimators_agree": true, + "dft_peak_hz": 100.02497834462315, + "phase_mean_flicker_hz": 100.02740075286172, + "patch_ids": [ + 31, + 39, + 13, + 7, + 14, + 23, + 54, + 15, + 28, + 60, + 55, + 61, + 30, + 36, + 6, + 63 + ], + "track_samples": 66, + "verdict_rule": "S13.5", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.5777, + "S2_linear": 2.4379, + "S7_rowsignal": 2.6242, + "S3_readout": 7.8005, + "S4_motion": 6.744, + "S5_segment": 0.9506, + "S6_patches": 5.5234, + "S8_phase": 4.6962, + "S10_match": 0.1805, + "S14_overlay": 24.2106, + "S15_report": 0.8063 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/aws4-agent-recovery-041816/overlay.mp4", + "report_html": "/app/work/jobs/aws4-agent-recovery-041816/report.html", + "report_pdf": "/app/work/jobs/aws4-agent-recovery-041816/report.pdf", + "report_json": "/app/work/jobs/aws4-agent-recovery-041816/result.json", + "plot_enf_track": "/app/work/jobs/aws4-agent-recovery-041816/enf_track.png", + "plot_band_amplitude": "/app/work/jobs/aws4-agent-recovery-041816/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws4-agent-recovery-041816/trace.json b/results/aws/aws4-agent-recovery-041816/trace.json new file mode 100644 index 0000000..43e00a1 --- /dev/null +++ b/results/aws/aws4-agent-recovery-041816/trace.json @@ -0,0 +1,131 @@ +{ + "job_id": "aws4-agent-recovery-041816", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:24:04.775738+00:00", + "t_end": "2026-10-27T04:24:08.512352+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2100,\"bitrate\":1306717,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.7366, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:24:08.512655+00:00", + "t_end": "2026-10-27T04:24:16.681701+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025285470085468713,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.7604,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 8.169, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:24:16.682517+00:00", + "t_end": "2026-10-27T04:24:26.137695+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1767,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws4-agent-recovery-041816:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.4552, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:24:26.138020+00:00", + "t_end": "2026-10-27T04:24:32.110458+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[31,39,13,7,14,23,54,15,28,60,55,61,30,36,6,63],\"ranked\":[{\"id\":31,\"score_db\":8.17},{\"id\":39,\"score_db\":7.77},{\"id\":13,\"score_db\":7.52},{\"id\":7,\"score_db\":7.16},{\"id\":14,\"score_db\":7.16},{\"id\":23,\"score_db\":7.07},{\"id\":54,\"score_db\":6.95},{\"id\":15,\"score_db\":6.94},{\"id\":28,\"score_db\":6.89},{\"id\":60,\"score_db\":6.8},{\"id\":55,\"score_db\":6.61},{\"id\":61,\"score_db\":6.58},{\"id\":30,\"score_db\":6.57},{\"id\":36,\"score_db\":6.41},{\"id\":6,\"score_db\":6.33},{\"id\":63,\"score_db\":6.29}],\"eligible\":64,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 5.9724, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:24:32.110856+00:00", + "t_end": "2026-10-27T04:24:37.584118+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\",\"patch_ids\":[31,39,13,7,14,23,54,15,28,60,55,61,30,36,6,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":7.539,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2100,\"track_samples\":66,\"mean_flicker_hz\":100.0274,\"dft_peak_hz\":100.02498,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":7.59,\"cols+@100\":-2.72,\"cols-@100\":-2.72,\"rows-@100\":7.59,\"cols-@120\":-1.12,\"cols+@120\":-1.12,\"rows-@120\":-2.6,\"rows+@120\":-2.6}}", + "decision_reason": "bedrock planner choice", + "duration_s": 5.4733, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:24:37.584540+00:00", + "t_end": "2026-10-27T04:24:38.323611+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"unknown\",\"passes\":false,\"best_offset_utc\":null,\"rho1\":null,\"rho2\":null,\"margin\":null,\"psr\":null,\"track_length_s\":0.0,\"time_uncertainty_s\":null,\"segments_consistent\":null,\"reasons\":[\"NO_REFERENCE_COVERAGE\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.7391, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T04:24:38.324006+00:00", + "t_end": "2026-10-27T04:24:39.052124+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_ESTIMATED\",\"NO_REFERENCE_COVERAGE\"],\"rule\":\"S13.5\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.7281, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T04:24:39.052535+00:00", + "t_end": "2026-10-27T04:24:39.614774+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\",\"kind\":\"camera_model\",\"message\":\"Can you provide the camera model used to capture this video?\"}", + "output_summary": "{\"request_id\":\"aws4-agent-recovery-041816:camera_model\",\"status\":\"open\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.5622, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:24:39.615223+00:00", + "t_end": "2026-10-27T04:25:05.654125+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"aws4-agent-recovery-041816\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/aws4-agent-recovery-041816/overlay.mp4\",\"report_html\":\"/app/work/jobs/aws4-agent-recovery-041816/report.html\",\"report_pdf\":\"/app/work/jobs/aws4-agent-recovery-041816/report.pdf\",\"report_json\":\"/app/work/jobs/aws4-agent-recovery-041816/result.json\",\"plot_enf_track\":\"/app/work/jobs/aws4-agent-recovery-041816/enf_track.png\",\"plot_band_amplitude\":\"/app/work/jobs/aws4-agent-recovery-041816/band_amplitude.png\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "guard: planner proposed probe_video {} (identical call already made); fallback rule: render report", + "duration_s": 26.0389, + "error": null, + "policy_note": null + } + ] +} \ No newline at end of file diff --git a/results/aws/aws4-capture-verified-041747/band_amplitude.png b/results/aws/aws4-capture-verified-041747/band_amplitude.png new file mode 100644 index 0000000..27e5cd7 Binary files /dev/null and b/results/aws/aws4-capture-verified-041747/band_amplitude.png differ diff --git a/results/aws/aws4-capture-verified-041747/enf_track.png b/results/aws/aws4-capture-verified-041747/enf_track.png new file mode 100644 index 0000000..161a1e1 Binary files /dev/null and b/results/aws/aws4-capture-verified-041747/enf_track.png differ diff --git a/results/aws/aws4-capture-verified-041747/ncc_scan.png b/results/aws/aws4-capture-verified-041747/ncc_scan.png new file mode 100644 index 0000000..1c7d1a0 Binary files /dev/null and b/results/aws/aws4-capture-verified-041747/ncc_scan.png differ diff --git a/results/aws/aws4-capture-verified-041747/phase_residual.png b/results/aws/aws4-capture-verified-041747/phase_residual.png new file mode 100644 index 0000000..ce1b1df Binary files /dev/null and b/results/aws/aws4-capture-verified-041747/phase_residual.png differ diff --git a/results/aws/aws4-capture-verified-041747/plots.json b/results/aws/aws4-capture-verified-041747/plots.json new file mode 100644 index 0000000..725fc7b --- /dev/null +++ b/results/aws/aws4-capture-verified-041747/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "phase_residual.png", "alt": "Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.", "caption": "Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/aws4-capture-verified-041747/report.html b/results/aws/aws4-capture-verified-041747/report.html new file mode 100644 index 0000000..2e3c814 --- /dev/null +++ b/results/aws/aws4-capture-verified-041747/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report aws4-capture-verified-041747 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T09:59:59.973488+00:00 ± 1.5 s
Grid zoneSIM50
Reasons
  • READOUT_FROM_SIDECAR — Readout time came from the Capture sidecar.
  • MATCH_OK — The track matches the reference log at one time.
Matchpeak correlation 0.991, next peak 0.795, track length 69 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.
Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash0161b96f77d3e925
Jobaws4-capture-verified-041747
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db6.614609559814535
bitrate475816
bits_per_pixel0.2065173611111111
camera_motion_px0.0332642155899567
codech264
dft_peak_hz100.02936157407733
estimators_agreeTrue
foreground_fraction0.052797619047619045
frames2100
height240
jitter_p50_ms3.3302427482340136e-07
jitter_p95_ms3.3385298969790256e-07
motion_level_px0.1115635689380337
nominal_flicker_hz100.0
opencv_frame_count2100
phase_mean_flicker_hz100.02602150557438
readout_s0.025
readout_sourceREADOUT_FROM_SIDECAR
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcesensor
timing_assumptionsensor_timestamp_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.2958
S2_linear2.1547
S3_readout0.0
S4_motion6.4506
S5_segment0.9503
S7_rowsignal1.3239
S6_patches1.5129
S8_phase0.7567
S10_match0.7072
S11_continuity0.0009
+
+
+ + \ No newline at end of file diff --git a/results/aws/aws4-capture-verified-041747/report.pdf b/results/aws/aws4-capture-verified-041747/report.pdf new file mode 100644 index 0000000..9429a9c Binary files /dev/null and b/results/aws/aws4-capture-verified-041747/report.pdf differ diff --git a/results/aws/aws4-capture-verified-041747/result.json b/results/aws/aws4-capture-verified-041747/result.json new file mode 100644 index 0000000..23e9ab1 --- /dev/null +++ b/results/aws/aws4-capture-verified-041747/result.json @@ -0,0 +1,126 @@ +{ + "job_id": "aws4-capture-verified-041747", + "file_sha256": "b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "time_estimate_utc": 1768903199.973488, + "time_estimate_iso": "2026-01-20T09:59:59.973488+00:00", + "time_uncertainty_s": 1.5286580289326472, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768899600.0, + "window_end_utc": 1768906800.0, + "best_offset_utc": 1768903199.973488, + "rho1": 0.9909874022161358, + "rho2": 0.7951988689159832, + "margin": 0.19578853330015256, + "psr": 3.050841986738423, + "track_length_s": 69.0, + "time_uncertainty_s": 1.5286580289326472, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.8615518, + "rho1": 0.9934339164846053, + "margin": 0.05956432675752066, + "passes": true + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.0238047, + "rho1": 0.9895411662553197, + "margin": 0.025741222118284002, + "passes": true + } + ], + "segments_consistent": true + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2100, + "bitrate": 475816, + "bits_per_pixel": 0.2065173611111111, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "sensor", + "jitter_p50_ms": 3.3302427482340136e-07, + "jitter_p95_ms": 3.3385298969790256e-07, + "timing_assumption": "sensor_timestamp_is_first_row_exposure_start", + "opencv_frame_count": 2100, + "gaps": [], + "readout_s": 0.025, + "readout_source": "READOUT_FROM_SIDECAR", + "motion_level_px": 0.1115635689380337, + "camera_motion_px": 0.0332642155899567, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.052797619047619045, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 6.614609559814535, + "estimators_agree": true, + "dft_peak_hz": 100.02936157407733, + "phase_mean_flicker_hz": 100.02602150557438, + "patch_ids": [ + 63, + 53, + 61, + 62, + 23, + 15, + 35, + 37, + 36, + 31, + 22, + 29, + 25, + 30 + ], + "track_samples": 66, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.2958, + "S2_linear": 2.1547, + "S3_readout": 0.0, + "S4_motion": 6.4506, + "S5_segment": 0.9503, + "S7_rowsignal": 1.3239, + "S6_patches": 1.5129, + "S8_phase": 0.7567, + "S10_match": 0.7072, + "S11_continuity": 0.0009, + "S14_overlay": 37.317, + "S15_report": 1.0563 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/aws4-capture-verified-041747/overlay.mp4", + "report_html": "/app/work/jobs/aws4-capture-verified-041747/report.html", + "report_pdf": "/app/work/jobs/aws4-capture-verified-041747/report.pdf", + "report_json": "/app/work/jobs/aws4-capture-verified-041747/result.json", + "plot_enf_track": "/app/work/jobs/aws4-capture-verified-041747/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/aws4-capture-verified-041747/ncc_scan.png", + "plot_phase_residual": "/app/work/jobs/aws4-capture-verified-041747/phase_residual.png", + "plot_band_amplitude": "/app/work/jobs/aws4-capture-verified-041747/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws4-capture-verified-041747/trace.json b/results/aws/aws4-capture-verified-041747/trace.json new file mode 100644 index 0000000..0d128a5 --- /dev/null +++ b/results/aws/aws4-capture-verified-041747/trace.json @@ -0,0 +1,131 @@ +{ + "job_id": "aws4-capture-verified-041747", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:25:08.745155+00:00", + "t_end": "2026-10-27T04:25:11.862791+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2100,\"bitrate\":475816,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.1176, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:25:11.863106+00:00", + "t_end": "2026-10-27T04:25:12.338466+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.4754, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:25:12.339426+00:00", + "t_end": "2026-10-27T04:25:21.511591+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1116,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws4-capture-verified-041747:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.1722, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:25:21.511924+00:00", + "t_end": "2026-10-27T04:25:23.412067+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\":18.75},{\"id\":39,\"score_db\":18.67}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.9001, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:25:23.413031+00:00", + "t_end": "2026-10-27T04:25:25.191507+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\",\"patch_ids\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":6.615,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2100,\"track_samples\":66,\"mean_flicker_hz\":100.02602,\"dft_peak_hz\":100.02936,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":6.64}}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.7785, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:25:25.191902+00:00", + "t_end": "2026-10-27T04:25:26.347734+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903199.973488,\"rho1\":0.9909874022161358,\"rho2\":0.7951988689159832,\"margin\":0.19578853330015256,\"psr\":3.050841986738423,\"track_length_s\":69.0,\"time_uncertainty_s\":1.5286580289326472,\"segments_consistent\":true,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.1558, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T04:25:26.348153+00:00", + "t_end": "2026-10-27T04:25:26.765197+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[],\"edit_candidates\":0,\"dropped_explained\":0,\"reasons\":[]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.417, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T04:25:26.765611+00:00", + "t_end": "2026-10-27T04:25:27.573124+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"MATCH_OK\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.8075, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:25:27.573584+00:00", + "t_end": "2026-10-27T04:26:06.339956+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"aws4-capture-verified-041747\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/aws4-capture-verified-041747/overlay.mp4\",\"report_html\":\"/app/work/jobs/aws4-capture-verified-041747/report.html\",\"report_pdf\":\"/app/work/jobs/aws4-capture-verified-041747/report.pdf\",\"report_json\":\"/app/work/jobs/aws4-capture-verified-041747/result.json\",\"plot_enf_track\":\"/app/work/jobs/aws4-capture-verified-041747/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/aws4-capture-verified-041747/ncc_scan.png\",\"plot_phase_residual\":\"/app/work/jobs/aws4-capture-verified-041747/phase_residual.png\",\"plot_band_amplitude\":\"/app/work/jobs/aws4-capture-verifie...", + "decision_reason": "policy: report must be rendered", + "duration_s": 38.7664, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws4-cut-1s-041731/band_amplitude.png b/results/aws/aws4-cut-1s-041731/band_amplitude.png new file mode 100644 index 0000000..8675480 Binary files /dev/null and b/results/aws/aws4-cut-1s-041731/band_amplitude.png differ diff --git a/results/aws/aws4-cut-1s-041731/enf_track.png b/results/aws/aws4-cut-1s-041731/enf_track.png new file mode 100644 index 0000000..a10b7df Binary files /dev/null and b/results/aws/aws4-cut-1s-041731/enf_track.png differ diff --git a/results/aws/aws4-cut-1s-041731/ncc_scan.png b/results/aws/aws4-cut-1s-041731/ncc_scan.png new file mode 100644 index 0000000..4df7dfb Binary files /dev/null and b/results/aws/aws4-cut-1s-041731/ncc_scan.png differ diff --git a/results/aws/aws4-cut-1s-041731/plots.json b/results/aws/aws4-cut-1s-041731/plots.json new file mode 100644 index 0000000..2a031be --- /dev/null +++ b/results/aws/aws4-cut-1s-041731/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/aws4-cut-1s-041731/report.html b/results/aws/aws4-cut-1s-041731/report.html new file mode 100644 index 0000000..1dddc7e --- /dev/null +++ b/results/aws/aws4-cut-1s-041731/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report aws4-cut-1s-041731 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T10:00:00.471766+00:00 ± 1.6 s
Grid zoneSIM50
Reasons
  • READOUT_ESTIMATED — Readout time was estimated from the video (lower confidence).
  • MATCH_OK — The track matches the reference log at one time.
  • CLAIM_TIME_MATCH — The matched time agrees with the claimed time.
Matchpeak correlation 0.932, next peak 0.776, track length 68 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256d3bae5ec5c6bd5b06af56990a213e435af44e659a5468937053efb4380f4d2db
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash0161b96f77d3e925
Jobaws4-cut-1s-041731
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db11.376864427453565
bitrate477539
bits_per_pixel0.20726519097222224
camera_motion_px0.033711360290670817
codech264
dft_peak_hz100.03024479206044
estimators_agreeTrue
foreground_fraction0.05245036986714976
frames2070
height240
jitter_p50_ms7.105427357601002e-12
jitter_p95_ms2.042810365310288e-11
motion_level_px0.11003735380219795
nominal_flicker_hz100.0
opencv_frame_count2070
phase_mean_flicker_hz100.02666757998168
readout_s0.025285470085468713
readout_sourceREADOUT_ESTIMATED
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcepts
timing_assumptionpts_is_first_row_exposure_start
track_idt1
track_samples65
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.2926
S2_linear2.1276
S7_rowsignal2.5711
S3_readout4.4656
S6_patches3.1795
S4_motion6.3441
S5_segment0.9508
S8_phase2.4438
S10_match0.2308
+
+
+ + \ No newline at end of file diff --git a/results/aws/aws4-cut-1s-041731/report.pdf b/results/aws/aws4-cut-1s-041731/report.pdf new file mode 100644 index 0000000..2212ae1 Binary files /dev/null and b/results/aws/aws4-cut-1s-041731/report.pdf differ diff --git a/results/aws/aws4-cut-1s-041731/result.json b/results/aws/aws4-cut-1s-041731/result.json new file mode 100644 index 0000000..37cc052 --- /dev/null +++ b/results/aws/aws4-cut-1s-041731/result.json @@ -0,0 +1,175 @@ +{ + "job_id": "aws4-cut-1s-041731", + "file_sha256": "d3bae5ec5c6bd5b06af56990a213e435af44e659a5468937053efb4380f4d2db", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK", + "CLAIM_TIME_MATCH" + ], + "time_estimate_utc": 1768903200.4717665, + "time_estimate_iso": "2026-01-20T10:00:00.471766+00:00", + "time_uncertainty_s": 1.645561668071094, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768902600.0, + "window_end_utc": 1768903800.0, + "best_offset_utc": 1768903200.4717665, + "rho1": 0.9319962118367598, + "rho2": 0.7758892787102271, + "margin": 0.1561069331265328, + "psr": 3.0362738198273584, + "track_length_s": 68.0, + "time_uncertainty_s": 1.645561668071094, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.8310864, + "rho1": 0.9559694377951191, + "margin": 0.09845394384485895, + "passes": true + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.964459, + "rho1": 0.9673168146236402, + "margin": 0.054882998215194045, + "passes": true + } + ], + "segments_consistent": true + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2070, + "bitrate": 477539, + "bits_per_pixel": 0.20726519097222224, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "pts", + "jitter_p50_ms": 7.105427357601002e-12, + "jitter_p95_ms": 2.042810365310288e-11, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 2070, + "gaps": [], + "readout_s": 0.025285470085468713, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 0.11003735380219795, + "camera_motion_px": 0.033711360290670817, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.05245036986714976, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 11.376864427453565, + "estimators_agree": true, + "dft_peak_hz": 100.03024479206044, + "phase_mean_flicker_hz": 100.02666757998168, + "patch_ids": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ], + "track_samples": 65, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.2926, + "S2_linear": 2.1276, + "S7_rowsignal": 2.5711, + "S3_readout": 4.4656, + "S6_patches": 3.1795, + "S4_motion": 6.3441, + "S5_segment": 0.9508, + "S8_phase": 2.4438, + "S10_match": 0.2308, + "S14_overlay": 22.8081, + "S15_report": 0.9082 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/aws4-cut-1s-041731/overlay.mp4", + "report_html": "/app/work/jobs/aws4-cut-1s-041731/report.html", + "report_pdf": "/app/work/jobs/aws4-cut-1s-041731/report.pdf", + "report_json": "/app/work/jobs/aws4-cut-1s-041731/result.json", + "plot_enf_track": "/app/work/jobs/aws4-cut-1s-041731/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/aws4-cut-1s-041731/ncc_scan.png", + "plot_band_amplitude": "/app/work/jobs/aws4-cut-1s-041731/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws4-cut-1s-041731/trace.json b/results/aws/aws4-cut-1s-041731/trace.json new file mode 100644 index 0000000..d128b1e --- /dev/null +++ b/results/aws/aws4-cut-1s-041731/trace.json @@ -0,0 +1,131 @@ +{ + "job_id": "aws4-cut-1s-041731", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:23:09.776326+00:00", + "t_end": "2026-10-27T04:23:12.811369+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2070,\"bitrate\":477539,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.035, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:23:12.811682+00:00", + "t_end": "2026-10-27T04:23:18.071854+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025285470085468713,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.9317,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 5.2602, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:23:18.072639+00:00", + "t_end": "2026-10-27T04:23:21.700715+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[35,37,23,36,53,31,30,15,25,29,39,34,28,22,43,17],\"ranked\":[{\"id\":35,\"score_db\":19.52},{\"id\":37,\"score_db\":19.46},{\"id\":23,\"score_db\":19.42},{\"id\":36,\"score_db\":19.39},{\"id\":53,\"score_db\":19.36},{\"id\":31,\"score_db\":19.28},{\"id\":30,\"score_db\":19.18},{\"id\":15,\"score_db\":19.01},{\"id\":25,\"score_db\":19.01},{\"id\":29,\"score_db\":18.96},{\"id\":39,\"score_db\":18.88},{\"id\":34,\"score_db\":18.74},{\"id\":28,\"score_db\":18.67},{\"id\":22,\"score_db\":18.64},{\"id\":43,\"score_db\":18.56},{\"id\":17,\"score_db\":18.45}],\"eligible\":64,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.6281, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:23:21.701086+00:00", + "t_end": "2026-10-27T04:23:31.287456+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.11,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws4-cut-1s-041731:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [35, 37, 23, 36, 53, 31, 30, 15, 25, 29, 39, 34, 28, 22, 43, 17], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: find static background", + "duration_s": 9.5864, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:23:31.287830+00:00", + "t_end": "2026-10-27T04:23:32.159910+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":35,\"score_db\":19.52},{\"id\":37,\"score_db\":19.46},{\"id\":23,\"score_db\":19.42},{\"id\":36,\"score_db\":19.39},{\"id\":53,\"score_db\":19.36},{\"id\":31,\"score_db\":19.28},{\"id\":30,\"score_db\":19.18},{\"id\":15,\"score_db\":19.01},{\"id\":25,\"score_db\":19.01},{\"id\":29,\"score_db\":18.96},{\"id\":39,\"score_db\":18.88},{\"id\":34,\"score_db\":18.74},{\"id\":28,\"score_db\":18.67},{\"id\":22,\"score_db\":18....", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [35, 37, 23, 36, 53, 31, 30, 15, 25, 29, 39, 34, 28, 22, 43, 17], 'axis': 'rows+', 'frame_subset': 'low_motion'} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 0.8721, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:23:32.160325+00:00", + "t_end": "2026-10-27T04:23:35.467179+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.377,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2070,\"track_samples\":65,\"mean_flicker_hz\":100.02667,\"dft_peak_hz\":100.03024,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.4,\"cols-@100\":-11.27,\"cols+@100\":-11.27,\"rows-@100\":11.4}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 60, 'patch_ids': [35, 37, 23, 36, 53, 31, 30, 15, 25, 29, 39, 34, 28, 22, 43, 17], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 3.3069, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T04:23:35.467612+00:00", + "t_end": "2026-10-27T04:23:36.278593+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903200.4717665,\"rho1\":0.9319962118367598,\"rho2\":0.7758892787102271,\"margin\":0.1561069331265328,\"psr\":3.0362738198273584,\"track_length_s\":68.0,\"time_uncertainty_s\":1.645561668071094,\"segments_consistent\":true,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.811, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T04:23:36.279038+00:00", + "t_end": "2026-10-27T04:23:36.969248+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_ESTIMATED\",\"MATCH_OK\",\"CLAIM_TIME_MATCH\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6902, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:23:36.969698+00:00", + "t_end": "2026-10-27T04:24:01.202723+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"aws4-cut-1s-041731\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/aws4-cut-1s-041731/overlay.mp4\",\"report_html\":\"/app/work/jobs/aws4-cut-1s-041731/report.html\",\"report_pdf\":\"/app/work/jobs/aws4-cut-1s-041731/report.pdf\",\"report_json\":\"/app/work/jobs/aws4-cut-1s-041731/result.json\",\"plot_enf_track\":\"/app/work/jobs/aws4-cut-1s-041731/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/aws4-cut-1s-041731/ncc_scan.png\",\"plot_band_amplitude\":\"/app/work/jobs/aws4-cut-1s-041731/band_amplitude.png\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "policy: report must be rendered", + "duration_s": 24.233, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws4-daylight-only-041808/result.json b/results/aws/aws4-daylight-only-041808/result.json new file mode 100644 index 0000000..2c20b7b --- /dev/null +++ b/results/aws/aws4-daylight-only-041808/result.json @@ -0,0 +1,84 @@ +{ + "job_id": "aws4-daylight-only-041808", + "file_sha256": "a1f5df2265f07417958bcc9faa60ea67758cb7e8c53aaf49bbde3cc85a2e910b", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "DRAFT", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED", + "HIGH_COMPRESSION", + "USER_INPUT_REQUESTED" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": null, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 900, + "bitrate": 22317, + "bits_per_pixel": 0.009686197916666667, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "pts", + "jitter_p50_ms": 2.1316282072803006e-11, + "jitter_p95_ms": 4.618527782440651e-11, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 900, + "gaps": [], + "readout_s": 0.013251282051282013, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 0.0010156696784385465, + "camera_motion_px": 0.0007207718525162645, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.0, + "track_id": "t2", + "axis": "rows-", + "nominal_flicker_hz": 120.0, + "band_snr_db": -10.996643949422392, + "estimators_agree": false, + "dft_peak_hz": 120.76848836050938, + "phase_mean_flicker_hz": 120.10184976056289, + "patch_ids": [ + 22, + 31, + 15, + 27, + 17, + 19, + 46, + 45, + 52, + 53, + 13, + 60, + 30, + 16, + 23 + ], + "track_samples": 26, + "verdict_rule": "S13.1" + }, + "stage_timings_s": { + "S1_ingest": 0.0534, + "S2_linear": 0.8365, + "S7_rowsignal": 1.1071, + "S3_readout": 4.6561, + "S4_motion": 1.7013, + "S5_segment": 0.417, + "S6_patches": 2.3712, + "S8_phase": 4.0717 + }, + "artifacts": {}, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws4-daylight-only-041808/trace.json b/results/aws/aws4-daylight-only-041808/trace.json new file mode 100644 index 0000000..b645756 --- /dev/null +++ b/results/aws/aws4-daylight-only-041808/trace.json @@ -0,0 +1,159 @@ +{ + "job_id": "aws4-daylight-only-041808", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:22:44.230422+00:00", + "t_end": "2026-10-27T04:22:45.709266+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":900,\"bitrate\":22317,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":true,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.4788, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:22:45.709572+00:00", + "t_end": "2026-10-27T04:22:50.814362+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.013251282051282013,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.0209,\"low_confidence\":true}", + "decision_reason": "bedrock planner choice", + "duration_s": 5.1048, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:22:50.815276+00:00", + "t_end": "2026-10-27T04:22:51.510122+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"kind\":\"camera_model\",\"message\":\"Please provide the camera model for better analysis.\"}", + "output_summary": "{\"request_id\":\"aws4-daylight-only-041808:camera_model\",\"status\":\"open\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6948, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:22:51.510453+00:00", + "t_end": "2026-10-27T04:22:54.643765+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.001,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws4-daylight-only-041808:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.1333, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:22:54.645214+00:00", + "t_end": "2026-10-27T04:22:57.504262+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":22,\"score_db\":-17.26},{\"id\":31,\"score_db\":-17.88},{\"id\":15,\"score_db\":-18.59},{\"id\":27,\"score_db\":-18.61},{\"id\":17,\"score_db\":-19.16},{\"id\":19,\"score_db\":-19.45},{\"id\":46,\"score_db\":-19.55},{\"id\":45,\"score_db\":-19.93},{\"id\":52,\"score_db\":-19.93},{\"id\":53,\"score_db\":-20.02},{\"id\":13,\"score_db\":-20.45},{\"id\":60,\"score_db\":-21.03},{\"id\":30,\"score_db\":-21.51},{\"id\":16,\"sco...", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'axis': 'rows+', 'frame_subset': 'low_motion'} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 2.859, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:22:57.504654+00:00", + "t_end": "2026-10-27T04:23:00.445963+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"patch_ids\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":-12.226,\"axis\":\"rows+\",\"nominal_flicker_hz\":120.0,\"frames_used\":900,\"track_samples\":26,\"mean_flicker_hz\":120.1318,\"dft_peak_hz\":118.55883,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@120\":-12.95,\"rows-@120\":-12.95,\"cols-@120\":-14.73,\"cols+@120\":-14.73,\"rows-@100\":-14.18,\"rows+@100\":-14.18,\"cols-@100\":-16.51,\"cols+@100\":-16.51}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 60, 'patch_ids': [22, 31, 15, 27, 17, 19, 46, 45, 52, 53, 13, 60, 30, 16, 23, 14], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 2.9413, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T04:23:00.446404+00:00", + "t_end": "2026-10-27T04:23:02.432214+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[22,31,15,27,17,19,46,45,52,53,13,60,30,16,23],\"ranked\":[{\"id\":22,\"score_db\":-17.26},{\"id\":31,\"score_db\":-17.88},{\"id\":15,\"score_db\":-18.59},{\"id\":27,\"score_db\":-18.61},{\"id\":17,\"score_db\":-19.16},{\"id\":19,\"score_db\":-19.45},{\"id\":46,\"score_db\":-19.55},{\"id\":45,\"score_db\":-19.93},{\"id\":52,\"score_db\":-19.93},{\"id\":53,\"score_db\":-20.02},{\"id\":13,\"score_db\":-20.45},{\"id\":60,\"score_db\":-21.03},{\"id\":30,\"score_db\":-21.51},{\"id\":16,\"score_db\":-21.58},{\"id\":23,\"score_db\":-22.62},{\"id\":14,\"score_db\":-22.66}],\"eligible\":63,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.9858, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T04:23:02.432662+00:00", + "t_end": "2026-10-27T04:23:03.295603+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"kind\":\"original_file\",\"message\":\"The file is strongly compressed and the flicker signal is weak. Please upload the original file.\"}", + "output_summary": "{\"request_id\":\"aws4-daylight-only-041808:original_file\",\"status\":\"open\"}", + "decision_reason": "guard: planner proposed propose_patches {'strategy': 'top'} (identical call already made); fallback rule: B4: HIGH_COMPRESSION and weak signal", + "duration_s": 0.8629, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:23:03.296072+00:00", + "t_end": "2026-10-27T04:23:05.959901+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\",\"patch_ids\":[22,31,15,27,17,19,46,45,52,53,13,60,30,16,23]}", + "output_summary": "{\"track_id\":\"t2\",\"band_snr_db\":-10.997,\"axis\":\"rows-\",\"nominal_flicker_hz\":120.0,\"frames_used\":900,\"track_samples\":26,\"mean_flicker_hz\":120.10185,\"dft_peak_hz\":120.76849,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows-@120\":-12.65,\"rows+@120\":-12.65,\"cols+@120\":-14.99,\"cols-@120\":-14.99,\"cols+@100\":-15.85,\"cols-@100\":-15.85,\"rows-@100\":-15.88,\"rows+@100\":-15.88}}", + "decision_reason": "guard: planner proposed request_user_input {'kind': 'original_file', 'message': 'The file is strongly compressed and the flicker signal is weak. Please upload the original file.'} (identical call already made); fallback rule: B1: re-extract on the 15 highest-SNR patches", + "duration_s": 2.6638, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 9, + "t_start": "2026-10-27T04:23:05.960409+00:00", + "t_end": "2026-10-27T04:23:07.195418+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-daylight-only-041808\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"SIGNAL_ABSENT\",\"READOUT_ESTIMATED\",\"HIGH_COMPRESSION\",\"USER_INPUT_REQUESTED\"],\"rule\":\"S13.1\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.235, + "error": null, + "policy_note": null + }, + { + "index": 10, + "t_start": "2026-10-27T04:23:07.195914+00:00", + "t_end": "2026-10-27T04:23:07.828121+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "(stop)", + "input_summary": "{}", + "output_summary": "{}", + "decision_reason": "policy: review only for CONTRADICTED", + "duration_s": 0.6322, + "error": null, + "policy_note": "review blocked" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws4-dropped-frames-041757/band_amplitude.png b/results/aws/aws4-dropped-frames-041757/band_amplitude.png new file mode 100644 index 0000000..15d83a1 Binary files /dev/null and b/results/aws/aws4-dropped-frames-041757/band_amplitude.png differ diff --git a/results/aws/aws4-dropped-frames-041757/enf_track.png b/results/aws/aws4-dropped-frames-041757/enf_track.png new file mode 100644 index 0000000..dabbe8c Binary files /dev/null and b/results/aws/aws4-dropped-frames-041757/enf_track.png differ diff --git a/results/aws/aws4-dropped-frames-041757/ncc_scan.png b/results/aws/aws4-dropped-frames-041757/ncc_scan.png new file mode 100644 index 0000000..e4fc0d7 Binary files /dev/null and b/results/aws/aws4-dropped-frames-041757/ncc_scan.png differ diff --git a/results/aws/aws4-dropped-frames-041757/plots.json b/results/aws/aws4-dropped-frames-041757/plots.json new file mode 100644 index 0000000..2a031be --- /dev/null +++ b/results/aws/aws4-dropped-frames-041757/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/aws4-dropped-frames-041757/report.html b/results/aws/aws4-dropped-frames-041757/report.html new file mode 100644 index 0000000..286de12 --- /dev/null +++ b/results/aws/aws4-dropped-frames-041757/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report aws4-dropped-frames-041757 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T10:00:00.109978+00:00 ± 1.6 s
Grid zoneSIM50
Reasons
  • READOUT_ESTIMATED — Readout time was estimated from the video (lower confidence).
  • MATCH_OK — The track matches the reference log at one time.
Matchpeak correlation 0.957, next peak 0.771, track length 69 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-25697bd81ea29c2a33b16465d912f7ac4e526a0425b1cc54b33e27aeb10b46074b9
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash0161b96f77d3e925
Jobaws4-dropped-frames-041757
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db8.066753447894417
bitrate490747
bits_per_pixel0.21453018834932053
camera_motion_px0.032422965009069944
codech264
dft_peak_hz100.02934823200873
estimators_agreeTrue
foreground_fraction0.052121927458033575
frames2085
height240
jitter_p50_ms3.3305269653283176e-07
jitter_p95_ms3.338056941970535e-07
motion_level_px0.10989784047152439
nominal_flicker_hz100.0
opencv_frame_count2085
phase_mean_flicker_hz100.02626642175629
readout_s0.025285469843590924
readout_sourceREADOUT_ESTIMATED
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcesensor
timing_assumptionsensor_timestamp_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.3257
S2_linear2.1445
S3_readout2.0851
S7_rowsignal2.6154
S4_motion6.4908
S5_segment1.006
S6_patches1.5211
S8_phase0.7494
S10_match0.7262
+
+
+ + \ No newline at end of file diff --git a/results/aws/aws4-dropped-frames-041757/report.pdf b/results/aws/aws4-dropped-frames-041757/report.pdf new file mode 100644 index 0000000..9064681 Binary files /dev/null and b/results/aws/aws4-dropped-frames-041757/report.pdf differ diff --git a/results/aws/aws4-dropped-frames-041757/result.json b/results/aws/aws4-dropped-frames-041757/result.json new file mode 100644 index 0000000..71cf74a --- /dev/null +++ b/results/aws/aws4-dropped-frames-041757/result.json @@ -0,0 +1,135 @@ +{ + "job_id": "aws4-dropped-frames-041757", + "file_sha256": "97bd81ea29c2a33b16465d912f7ac4e526a0425b1cc54b33e27aeb10b46074b9", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK" + ], + "time_estimate_utc": 1768903200.109978, + "time_estimate_iso": "2026-01-20T10:00:00.109978+00:00", + "time_uncertainty_s": 1.612423172503822, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768899600.0, + "window_end_utc": 1768906800.0, + "best_offset_utc": 1768903200.109978, + "rho1": 0.95681091496428, + "rho2": 0.7706804381511355, + "margin": 0.18613047681314443, + "psr": 2.942828361245858, + "track_length_s": 69.0, + "time_uncertainty_s": 1.612423172503822, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.6371696, + "rho1": 0.9627293848844974, + "margin": 0.04941018234792338, + "passes": true + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.546203, + "rho1": 0.9598167015723367, + "margin": 0.0023399308189189227, + "passes": false + } + ], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2085, + "bitrate": 490747, + "bits_per_pixel": 0.21453018834932053, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "sensor", + "jitter_p50_ms": 3.3305269653283176e-07, + "jitter_p95_ms": 3.338056941970535e-07, + "timing_assumption": "sensor_timestamp_is_first_row_exposure_start", + "opencv_frame_count": 2085, + "gaps": [ + { + "frame_index": 600, + "t_s": 20.19999999999999, + "size_s": 0.20000000100000648 + }, + { + "frame_index": 1294, + "t_s": 43.633333332999996, + "size_s": 0.30000000000001137 + } + ], + "readout_s": 0.025285469843590924, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 0.10989784047152439, + "camera_motion_px": 0.032422965009069944, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.052121927458033575, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 8.066753447894417, + "estimators_agree": true, + "dft_peak_hz": 100.02934823200873, + "phase_mean_flicker_hz": 100.02626642175629, + "patch_ids": [ + 53, + 35, + 37, + 36, + 23, + 31, + 29, + 25, + 30, + 15, + 28, + 39, + 34, + 27 + ], + "track_samples": 66, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.3257, + "S2_linear": 2.1445, + "S3_readout": 2.0851, + "S7_rowsignal": 2.6154, + "S4_motion": 6.4908, + "S5_segment": 1.006, + "S6_patches": 1.5211, + "S8_phase": 0.7494, + "S10_match": 0.7262, + "S14_overlay": 24.0282, + "S15_report": 1.1517 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/aws4-dropped-frames-041757/overlay.mp4", + "report_html": "/app/work/jobs/aws4-dropped-frames-041757/report.html", + "report_pdf": "/app/work/jobs/aws4-dropped-frames-041757/report.pdf", + "report_json": "/app/work/jobs/aws4-dropped-frames-041757/result.json", + "plot_enf_track": "/app/work/jobs/aws4-dropped-frames-041757/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/aws4-dropped-frames-041757/ncc_scan.png", + "plot_band_amplitude": "/app/work/jobs/aws4-dropped-frames-041757/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/aws4-dropped-frames-041757/trace.json b/results/aws/aws4-dropped-frames-041757/trace.json new file mode 100644 index 0000000..ca553ce --- /dev/null +++ b/results/aws/aws4-dropped-frames-041757/trace.json @@ -0,0 +1,131 @@ +{ + "job_id": "aws4-dropped-frames-041757", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:21:52.772544+00:00", + "t_end": "2026-10-27T04:21:56.197756+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2085,\"bitrate\":490747,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":2,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.4252, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:21:56.198065+00:00", + "t_end": "2026-10-27T04:21:56.762270+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.5642, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:21:56.763054+00:00", + "t_end": "2026-10-27T04:21:59.213049+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\",\"method\":\"blind\"}", + "output_summary": "{\"readout_s\":0.025285469843590924,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.9325,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 2.45, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:21:59.213384+00:00", + "t_end": "2026-10-27T04:22:08.787979+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1099,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"aws4-dropped-frames-041757:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.5746, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:22:08.789088+00:00", + "t_end": "2026-10-27T04:22:10.778525+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[53,35,37,36,23,31,29,25,30,15,28,39,34,27],\"ranked\":[{\"id\":53,\"score_db\":19.65},{\"id\":35,\"score_db\":19.49},{\"id\":37,\"score_db\":19.49},{\"id\":36,\"score_db\":19.38},{\"id\":23,\"score_db\":19.33},{\"id\":31,\"score_db\":19.24},{\"id\":29,\"score_db\":19.19},{\"id\":25,\"score_db\":19.17},{\"id\":30,\"score_db\":19.07},{\"id\":15,\"score_db\":19.04},{\"id\":28,\"score_db\":18.84},{\"id\":39,\"score_db\":18.79},{\"id\":34,\"score_db\":18.71},{\"id\":27,\"score_db\":18.71},{\"id\":22,\"score_db\":18.65},{\"id\":43,\"score_db\":18.5}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.9894, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T04:22:10.778932+00:00", + "t_end": "2026-10-27T04:22:12.305999+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\",\"patch_ids\":[53,35,37,36,23,31,29,25,30,15,28,39,34,27]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":8.067,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2085,\"track_samples\":66,\"mean_flicker_hz\":100.02627,\"dft_peak_hz\":100.02935,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":8.09}}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.5271, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T04:22:12.306428+00:00", + "t_end": "2026-10-27T04:22:13.816806+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903200.109978,\"rho1\":0.95681091496428,\"rho2\":0.7706804381511355,\"margin\":0.18613047681314443,\"psr\":2.942828361245858,\"track_length_s\":69.0,\"time_uncertainty_s\":1.612423172503822,\"segments_consistent\":null,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.5104, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T04:22:13.817248+00:00", + "t_end": "2026-10-27T04:22:14.992926+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_ESTIMATED\",\"MATCH_OK\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.1757, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T04:22:14.993894+00:00", + "t_end": "2026-10-27T04:22:40.858493+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"aws4-dropped-frames-041757\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/aws4-dropped-frames-041757/overlay.mp4\",\"report_html\":\"/app/work/jobs/aws4-dropped-frames-041757/report.html\",\"report_pdf\":\"/app/work/jobs/aws4-dropped-frames-041757/report.pdf\",\"report_json\":\"/app/work/jobs/aws4-dropped-frames-041757/result.json\",\"plot_enf_track\":\"/app/work/jobs/aws4-dropped-frames-041757/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/aws4-dropped-frames-041757/ncc_scan.png\",\"plot_band_amplitude\":\"/app/work/jobs/aws4-dropped-frames-041757/band_amplitude.png\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "policy: report must be rendered", + "duration_s": 25.8646, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/aws4-insertion-041739/trace.json b/results/aws/aws4-insertion-041739/trace.json new file mode 100644 index 0000000..0e7485d --- /dev/null +++ b/results/aws/aws4-insertion-041739/trace.json @@ -0,0 +1,495 @@ +{ + "job_id": "aws4-insertion-041739", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T04:21:14.587898+00:00", + "t_end": "2026-10-27T04:21:18.837860+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":3060,\"bitrate\":475500,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 4.25, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T04:21:18.838194+00:00", + "t_end": "2026-10-27T04:21:28.301190+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025285470085468713,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.9319,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.463, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T04:21:28.302197+00:00", + "t_end": "2026-10-27T04:21:30.570334+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"strictness\":\"normal\"}", + "output_summary": "", + "decision_reason": "bedrock planner choice", + "duration_s": 2.2681, + "error": "Connection closed", + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T04:21:30.570751+00:00", + "t_end": "2026-10-27T04:21:31.349565+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"strategy\":\"all\"}", + "output_summary": "", + "decision_reason": "guard: planner proposed analyze_motion {'strictness': 'normal'} (identical call already made); fallback rule: rank light patches", + "duration_s": 0.7788, + "error": "", + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T04:21:31.349907+00:00", + "t_end": "2026-10-27T04:21:32.121138+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "guard: planner proposed analyze_motion {'strictness': 'normal'} (identical call already made); fallback rule: first extraction on all eligible patches", + "duration_s": 0.7712, + "error": "", + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 5, + "t_start": "2026-10-27T04:21:32.121509+00:00", + "t_end": "2026-10-27T04:21:33.043534+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"strategy\":\"top\"}", + "output_summary": "", + "decision_reason": "guard: planner proposed analyze_motion {'strictness': 'normal'} (identical call already made); fallback rule: B1: signal weak (band SNR None dB); re-rank patches", + "duration_s": 0.922, + "error": "", + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T04:21:33.043926+00:00", + "t_end": "2026-10-27T04:21:33.512032+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"nominal_hz\":50.0}", + "output_summary": "", + "decision_reason": "guard: planner proposed analyze_motion {'strictness': 'normal'} (identical call already made); fallback rule: B1: switch nominal frequency to 50 Hz", + "duration_s": 0.4681, + "error": "", + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T04:21:33.512457+00:00", + "t_end": "2026-10-27T04:21:34.886860+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"axis\":\"cols+\"}", + "output_summary": "", + "decision_reason": "guard: planner proposed analyze_motion {'strictness': 'normal'} (identical call already made); fallback rule: B1: switch sensor axis to cols+", + "duration_s": 1.3744, + "error": "", + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 8, + "t_start": "2026-10-27T04:21:34.887315+00:00", + "t_end": "2026-10-27T04:21:35.949468+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"strictness\":\"strict\"}", + "output_summary": "", + "decision_reason": "bedrock planner choice", + "duration_s": 1.0622, + "error": "", + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T04:21:35.949909+00:00", + "t_end": "2026-10-27T04:21:36.535847+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "guard: planner proposed analyze_motion {'strictness': 'strict'} (identical call already made); fallback rule: B5: no usable signal after the alternatives", + "duration_s": 0.5859, + "error": "", + "policy_note": null + }, + { + "index": 10, + "t_start": "2026-10-27T04:21:36.536332+00:00", + "t_end": "2026-10-27T04:21:37.138219+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"kind\":\"camera_model\",\"message\":\"Please provide the camera model used to capture the video.\"}", + "output_summary": "", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6019, + "error": "", + "policy_note": null + }, + { + "index": 11, + "t_start": "2026-10-27T04:21:37.138696+00:00", + "t_end": "2026-10-27T04:21:37.685272+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.5466, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 12, + "t_start": "2026-10-27T04:21:37.685791+00:00", + "t_end": "2026-10-27T04:21:38.196013+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.5102, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 13, + "t_start": "2026-10-27T04:21:38.197081+00:00", + "t_end": "2026-10-27T04:21:38.603353+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.4063, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 14, + "t_start": "2026-10-27T04:21:38.603897+00:00", + "t_end": "2026-10-27T04:21:39.129356+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.5255, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 15, + "t_start": "2026-10-27T04:21:39.129907+00:00", + "t_end": "2026-10-27T04:21:40.021999+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.8921, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 16, + "t_start": "2026-10-27T04:21:40.022600+00:00", + "t_end": "2026-10-27T04:21:40.632690+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.6101, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 17, + "t_start": "2026-10-27T04:21:40.633306+00:00", + "t_end": "2026-10-27T04:21:41.063227+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.4299, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 18, + "t_start": "2026-10-27T04:21:41.063846+00:00", + "t_end": "2026-10-27T04:21:41.570324+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.5065, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 19, + "t_start": "2026-10-27T04:21:41.570980+00:00", + "t_end": "2026-10-27T04:21:42.321944+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.751, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 20, + "t_start": "2026-10-27T04:21:42.322604+00:00", + "t_end": "2026-10-27T04:21:42.947756+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.6252, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 21, + "t_start": "2026-10-27T04:21:42.948431+00:00", + "t_end": "2026-10-27T04:21:43.324709+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.3763, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 22, + "t_start": "2026-10-27T04:21:43.325393+00:00", + "t_end": "2026-10-27T04:21:43.888334+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.5629, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 23, + "t_start": "2026-10-27T04:21:43.889053+00:00", + "t_end": "2026-10-27T04:21:44.518908+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.6299, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 24, + "t_start": "2026-10-27T04:21:44.519653+00:00", + "t_end": "2026-10-27T04:21:44.935687+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.416, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 25, + "t_start": "2026-10-27T04:21:44.936433+00:00", + "t_end": "2026-10-27T04:21:45.640572+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.7041, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 26, + "t_start": "2026-10-27T04:21:45.641379+00:00", + "t_end": "2026-10-27T04:21:46.148758+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\"}", + "output_summary": "", + "decision_reason": "policy: verdict before report", + "duration_s": 0.5074, + "error": "", + "policy_note": "report before verdict" + }, + { + "index": 27, + "t_start": "2026-10-27T04:21:46.149547+00:00", + "t_end": "2026-10-27T04:21:46.548503+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.399, + "error": "", + "policy_note": "budget exhausted" + }, + { + "index": 28, + "t_start": "2026-10-27T04:21:46.549307+00:00", + "t_end": "2026-10-27T04:21:47.133518+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.5842, + "error": "", + "policy_note": "budget exhausted" + }, + { + "index": 29, + "t_start": "2026-10-27T04:21:47.134319+00:00", + "t_end": "2026-10-27T04:21:47.500874+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.3666, + "error": "", + "policy_note": "budget exhausted" + }, + { + "index": 30, + "t_start": "2026-10-27T04:21:47.501757+00:00", + "t_end": "2026-10-27T04:21:47.902085+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.4003, + "error": "", + "policy_note": "budget exhausted" + }, + { + "index": 31, + "t_start": "2026-10-27T04:21:47.903488+00:00", + "t_end": "2026-10-27T04:21:48.852224+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.9487, + "error": "", + "policy_note": "budget exhausted" + }, + { + "index": 32, + "t_start": "2026-10-27T04:21:48.853121+00:00", + "t_end": "2026-10-27T04:21:49.706484+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.8534, + "error": "", + "policy_note": "budget exhausted" + }, + { + "index": 33, + "t_start": "2026-10-27T04:21:49.707422+00:00", + "t_end": "2026-10-27T04:21:50.272002+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.5646, + "error": "", + "policy_note": "budget exhausted" + }, + { + "index": 34, + "t_start": "2026-10-27T04:21:50.272907+00:00", + "t_end": "2026-10-27T04:21:50.886440+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"aws4-insertion-041739\",\"budget_exhausted\":true}", + "output_summary": "", + "decision_reason": "policy: tool-call budget exhausted (B5)", + "duration_s": 0.6135, + "error": "", + "policy_note": "budget exhausted" + } + ] +} \ No newline at end of file diff --git a/results/aws/cd65b6ea0c20/result.json b/results/aws/cd65b6ea0c20/result.json new file mode 100644 index 0000000..779587e --- /dev/null +++ b/results/aws/cd65b6ea0c20/result.json @@ -0,0 +1,86 @@ +{ + "job_id": "cd65b6ea0c20", + "file_sha256": "db19aa5e172de1fe3c402ac5606c47090df0d20110bca8fdc9f0bd3ac423770d", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "DRAFT", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED", + "USER_INPUT_REQUESTED" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": { + "zone": "unknown", + "window_start_utc": 0.0, + "window_end_utc": 0.0, + "best_offset_utc": null, + "rho1": null, + "rho2": null, + "margin": null, + "psr": null, + "track_length_s": 41.0, + "time_uncertainty_s": null, + "passes": false, + "segments": [], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 1920, + "height": 1080, + "frames": 1323, + "bitrate": 15315769, + "bits_per_pixel": 0.24620256237139918, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "pts", + "jitter_p50_ms": 1.4210854715202004e-11, + "jitter_p95_ms": 4.263256414560601e-11, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 1323, + "gaps": [], + "readout_s": 0.02182564102564095, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 1.0034724962962192, + "camera_motion_px": 0.750985556604536, + "static_fraction": 0.5947267538702724, + "segmentation": "ok", + "foreground_fraction": 0.011900300243554212, + "track_id": "t2", + "axis": "cols-", + "nominal_flicker_hz": 120.0, + "band_snr_db": -7.1410614668336, + "estimators_agree": false, + "dft_peak_hz": 120.00108620225295, + "phase_mean_flicker_hz": 120.0492543407209, + "patch_ids": [ + 8, + 10, + 13, + 9 + ], + "track_samples": 41, + "verdict_rule": "S13.1" + }, + "stage_timings_s": { + "S1_ingest": 13.6506, + "S2_linear": 42.7896, + "S7_rowsignal": 1.7472, + "S3_readout": 5.4815, + "S4_motion": 2.2883, + "S5_segment": 0.6041, + "S6_patches": 3.2024, + "S8_phase": 9.3289 + }, + "artifacts": {}, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/cd65b6ea0c20/trace.json b/results/aws/cd65b6ea0c20/trace.json new file mode 100644 index 0000000..015d41d --- /dev/null +++ b/results/aws/cd65b6ea0c20/trace.json @@ -0,0 +1,229 @@ +{ + "job_id": "cd65b6ea0c20", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T05:54:12.672179+00:00", + "t_end": "2026-10-27T05:55:10.687379+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":1920,\"height\":1080,\"frames\":1323,\"bitrate\":15315769,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 58.0152, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T05:55:10.687746+00:00", + "t_end": "2026-10-27T05:55:16.646434+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.02182564102564095,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.4516,\"low_confidence\":true}", + "decision_reason": "bedrock planner choice", + "duration_s": 5.9587, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T05:55:16.647688+00:00", + "t_end": "2026-10-27T05:55:17.229767+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"kind\":\"camera_model\",\"message\":\"Please provide the camera model used to capture this video.\"}", + "output_summary": "{\"request_id\":\"cd65b6ea0c20:camera_model\",\"status\":\"open\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.5821, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T05:55:17.230102+00:00", + "t_end": "2026-10-27T05:55:21.808746+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":1.0035,\"static_fraction\":0.5947,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"cd65b6ea0c20:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 4.5786, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T05:55:21.809142+00:00", + "t_end": "2026-10-27T05:55:25.485775+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[8,10,13,9],\"ranked\":[{\"id\":8,\"score_db\":-11.86},{\"id\":10,\"score_db\":-11.9},{\"id\":13,\"score_db\":-11.92},{\"id\":9,\"score_db\":-11.96},{\"id\":12,\"score_db\":-12.07},{\"id\":18,\"score_db\":-16.54},{\"id\":21,\"score_db\":-17.21},{\"id\":20,\"score_db\":-17.45},{\"id\":19,\"score_db\":-18.12},{\"id\":2,\"score_db\":-25.31},{\"id\":6,\"score_db\":-25.99},{\"id\":0,\"score_db\":-29.06},{\"id\":7,\"score_db\":-29.13},{\"id\":1,\"score_db\":-31.35},{\"id\":5,\"score_db\":-33.16}],\"eligible\":15,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.6766, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T05:55:25.486190+00:00", + "t_end": "2026-10-27T05:55:26.042181+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[0,1,2,5,6,7,8,9,10,12,13,18,19,20,21],\"ranked\":[{\"id\":8,\"score_db\":-11.86},{\"id\":10,\"score_db\":-11.9},{\"id\":13,\"score_db\":-11.92},{\"id\":9,\"score_db\":-11.96},{\"id\":12,\"score_db\":-12.07},{\"id\":18,\"score_db\":-16.54},{\"id\":21,\"score_db\":-17.21},{\"id\":20,\"score_db\":-17.45},{\"id\":19,\"score_db\":-18.12},{\"id\":2,\"score_db\":-25.31},{\"id\":6,\"score_db\":-25.99},{\"id\":0,\"score_db\":-29.06},{\"id\":7,\"score_db\":-29.13},{\"id\":1,\"score_db\":-31.35},{\"id\":5,\"score_db\":-33.16}],\"eligible\":15,\"total\":64}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [8, 10, 13, 9], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 0.556, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T05:55:26.042603+00:00", + "t_end": "2026-10-27T05:55:29.490433+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"patch_ids\":[0,1,2,5,6,7,8,9,10,12,13,18,19,20,21]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":-11.572,\"axis\":\"cols-\",\"nominal_flicker_hz\":100.0,\"frames_used\":1323,\"track_samples\":41,\"mean_flicker_hz\":99.46444,\"dft_peak_hz\":100.07647,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"cols-@100\":-12.16,\"rows+@120\":-14.84,\"rows-@120\":-14.84,\"cols-@120\":-15.68,\"cols+@120\":-15.68,\"cols+@100\":-12.16,\"rows+@100\":-18.43,\"rows-@100\":-18.43}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [8, 10, 13, 9], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 3.4478, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T05:55:29.490883+00:00", + "t_end": "2026-10-27T05:55:33.145246+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"patch_ids\":[8,10,13,9]}", + "output_summary": "{\"track_id\":\"t2\",\"band_snr_db\":-7.141,\"axis\":\"cols-\",\"nominal_flicker_hz\":120.0,\"frames_used\":1323,\"track_samples\":41,\"mean_flicker_hz\":120.04925,\"dft_peak_hz\":120.00109,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"cols-@120\":-15.1,\"cols+@120\":-15.1,\"rows-@120\":-25.07,\"rows+@120\":-25.07,\"rows+@100\":-26.46,\"rows-@100\":-26.46,\"cols+@100\":-14.76,\"cols-@100\":-14.76}}", + "decision_reason": "guard: planner proposed propose_patches {'strategy': 'top'} (identical call already made); fallback rule: B1: re-extract on the 4 highest-SNR patches", + "duration_s": 3.6544, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 8, + "t_start": "2026-10-27T05:55:33.145752+00:00", + "t_end": "2026-10-27T05:55:33.872619+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"kind\":\"original_file\",\"message\":\"The current file has a weak signal. Please provide the original file if available.\"}", + "output_summary": "{\"request_id\":\"cd65b6ea0c20:original_file\",\"status\":\"open\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.7269, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T05:55:33.873085+00:00", + "t_end": "2026-10-27T05:55:35.980423+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"patch_ids\":[8,10,13,9],\"nominal_hz\":50.0}", + "output_summary": "{\"track_id\":\"t3\",\"band_snr_db\":-25.301,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":1321,\"track_samples\":41,\"mean_flicker_hz\":98.68286,\"dft_peak_hz\":100.07736,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@100\":-26.46,\"rows-@100\":-26.46,\"cols+@100\":-14.76,\"cols-@100\":-14.76}}", + "decision_reason": "guard: planner proposed request_user_input {'kind': 'original_file', 'message': 'The current file has a weak signal. Please provide the original file if available.'} (identical call already made); fallback rule: B1: switch nominal frequency to 50 Hz", + "duration_s": 2.1073, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 10, + "t_start": "2026-10-27T05:55:35.980937+00:00", + "t_end": "2026-10-27T05:55:36.504158+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"track_id\":\"t2\"}", + "output_summary": "{\"track_id\":\"t2\",\"passes\":false,\"reasons\":[],\"skipped\":\"no signal\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.5232, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 11, + "t_start": "2026-10-27T05:55:36.504667+00:00", + "t_end": "2026-10-27T05:55:37.164186+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"track_id\":\"t3\"}", + "output_summary": "{\"track_id\":\"t3\",\"passes\":false,\"reasons\":[],\"skipped\":\"no signal\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6595, + "error": null, + "policy_note": null + }, + { + "index": 12, + "t_start": "2026-10-27T05:55:37.164720+00:00", + "t_end": "2026-10-27T05:55:39.278324+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"nominal_hz\":60.0,\"patch_ids\":[8,10,13,9]}", + "output_summary": "{\"track_id\":\"t4\",\"band_snr_db\":-7.141,\"axis\":\"cols-\",\"nominal_flicker_hz\":120.0,\"frames_used\":1323,\"track_samples\":41,\"mean_flicker_hz\":120.04925,\"dft_peak_hz\":120.00109,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"cols-@120\":-15.1,\"cols+@120\":-15.1,\"rows-@120\":-25.07,\"rows+@120\":-25.07}}", + "decision_reason": "bedrock planner choice", + "duration_s": 2.1136, + "error": null, + "policy_note": null + }, + { + "index": 13, + "t_start": "2026-10-27T05:55:39.278905+00:00", + "t_end": "2026-10-27T05:55:40.685517+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\",\"patch_ids\":[8,10,13,9],\"axis\":\"rows+\"}", + "output_summary": "{\"track_id\":\"t5\",\"band_snr_db\":-24.115,\"axis\":\"rows+\",\"nominal_flicker_hz\":120.0,\"frames_used\":1321,\"track_samples\":41,\"mean_flicker_hz\":121.08181,\"dft_peak_hz\":120.1034,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@120\":-25.07,\"rows+@100\":-26.46}}", + "decision_reason": "guard: planner proposed request_user_input {'kind': 'original_file', 'message': 'The current file has a weak signal. Please provide the original file if available.'} (identical call already made); fallback rule: B1: switch sensor axis to rows+", + "duration_s": 1.4066, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 14, + "t_start": "2026-10-27T05:55:40.686108+00:00", + "t_end": "2026-10-27T05:55:41.830655+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"cd65b6ea0c20\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"SIGNAL_ABSENT\",\"READOUT_ESTIMATED\",\"USER_INPUT_REQUESTED\"],\"rule\":\"S13.1\"}", + "decision_reason": "policy: compute_verdict is required before stopping", + "duration_s": 1.1445, + "error": null, + "policy_note": "stop before verdict" + }, + { + "index": 15, + "t_start": "2026-10-27T05:55:41.831269+00:00", + "t_end": "2026-10-27T05:55:42.487460+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "(stop)", + "input_summary": "{}", + "output_summary": "{}", + "decision_reason": "policy: review only for CONTRADICTED", + "duration_s": 0.6562, + "error": null, + "policy_note": "review blocked" + } + ] +} \ No newline at end of file diff --git a/results/aws/e2e011233/band_amplitude.png b/results/aws/e2e011233/band_amplitude.png new file mode 100644 index 0000000..3fbf22b Binary files /dev/null and b/results/aws/e2e011233/band_amplitude.png differ diff --git a/results/aws/e2e011233/enf_track.png b/results/aws/e2e011233/enf_track.png new file mode 100644 index 0000000..ab1c541 Binary files /dev/null and b/results/aws/e2e011233/enf_track.png differ diff --git a/results/aws/e2e011233/plots.json b/results/aws/e2e011233/plots.json new file mode 100644 index 0000000..2ef1972 --- /dev/null +++ b/results/aws/e2e011233/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/e2e011233/report.html b/results/aws/e2e011233/report.html new file mode 100644 index 0000000..cb14359 --- /dev/null +++ b/results/aws/e2e011233/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report e2e011233 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
INCONCLUSIVE
+
The analysis could not reach a result. This alone does not mean the video is fake.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)Not determined
Grid zoneNot determined
Reasons
  • SIGNAL_ABSENT — No usable flicker signal was found. This is not evidence of a fake.
  • READOUT_FROM_SIDECAR — Readout time came from the Capture sidecar.
  • USER_INPUT_REQUESTED — The analysis asked the user for more information.
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash5c105287d4e1c479
Jobe2e011233
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db0.36278060400023876
bitrate475816
bits_per_pixel0.2065173611111111
camera_motion_px0.0332642155899567
codech264
dft_peak_hz120.02815194673165
estimators_agreeFalse
foreground_fraction0.052797619047619045
frames2100
height240
jitter_p50_ms3.3302427482340136e-07
jitter_p95_ms3.3385298969790256e-07
motion_level_px0.1115635689380337
nominal_flicker_hz120.0
opencv_frame_count2100
phase_mean_flicker_hz130.02598335700816
readout_s0.025
readout_sourceREADOUT_FROM_SIDECAR
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcesensor
timing_assumptionsensor_timestamp_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.1
width320
+

Stage timings (s)

+
S1_ingest0.295
S2_linear2.1483
S3_readout0.0
S4_motion6.4371
S5_segment0.9611
S7_rowsignal1.248
S6_patches2.4946
S8_phase0.7587
+
+
+ + \ No newline at end of file diff --git a/results/aws/e2e011233/report.pdf b/results/aws/e2e011233/report.pdf new file mode 100644 index 0000000..f6bd91e Binary files /dev/null and b/results/aws/e2e011233/report.pdf differ diff --git a/results/aws/e2e011233/result.json b/results/aws/e2e011233/result.json new file mode 100644 index 0000000..7278f3e --- /dev/null +++ b/results/aws/e2e011233/result.json @@ -0,0 +1,92 @@ +{ + "job_id": "e2e011233", + "file_sha256": "b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "5c105287d4e1c479", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_FROM_SIDECAR", + "USER_INPUT_REQUESTED" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": null, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2100, + "bitrate": 475816, + "bits_per_pixel": 0.2065173611111111, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "sensor", + "jitter_p50_ms": 3.3302427482340136e-07, + "jitter_p95_ms": 3.3385298969790256e-07, + "timing_assumption": "sensor_timestamp_is_first_row_exposure_start", + "opencv_frame_count": 2100, + "gaps": [], + "readout_s": 0.025, + "readout_source": "READOUT_FROM_SIDECAR", + "motion_level_px": 0.1115635689380337, + "camera_motion_px": 0.0332642155899567, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.052797619047619045, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 120.0, + "band_snr_db": 0.36278060400023876, + "estimators_agree": false, + "dft_peak_hz": 120.02815194673165, + "phase_mean_flicker_hz": 130.02598335700816, + "patch_ids": [ + 63, + 53, + 61, + 62, + 23, + 15, + 35, + 37, + 36, + 31, + 22, + 29, + 25, + 30 + ], + "track_samples": 66, + "verdict_rule": "S13.1", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.295, + "S2_linear": 2.1483, + "S3_readout": 0.0, + "S4_motion": 6.4371, + "S5_segment": 0.9611, + "S7_rowsignal": 1.248, + "S6_patches": 2.4946, + "S8_phase": 0.7587, + "S14_overlay": 23.1024, + "S15_report": 0.8881 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/e2e011233/overlay.mp4", + "report_html": "/app/work/jobs/e2e011233/report.html", + "report_pdf": "/app/work/jobs/e2e011233/report.pdf", + "report_json": "/app/work/jobs/e2e011233/result.json", + "plot_enf_track": "/app/work/jobs/e2e011233/enf_track.png", + "plot_band_amplitude": "/app/work/jobs/e2e011233/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/e2e011233/sidecar.json b/results/aws/e2e011233/sidecar.json new file mode 100644 index 0000000..8da06c9 --- /dev/null +++ b/results/aws/e2e011233/sidecar.json @@ -0,0 +1 @@ +{"app_version": "simulator", "device_model": "SIMULATED", "sensor_orientation": 0, "frame_sensor_timestamps_ns": [123456789000, 123490122333, 123523455666, 123556789000, 123590122333, 123623455666, 123656789000, 123690122333, 123723455666, 123756789000, 123790122333, 123823455666, 123856789000, 123890122333, 123923455666, 123956789000, 123990122333, 124023455666, 124056789000, 124090122333, 124123455666, 124156789000, 124190122333, 124223455666, 124256789000, 124290122333, 124323455666, 124356789000, 124390122333, 124423455666, 124456789000, 124490122333, 124523455666, 124556789000, 124590122333, 124623455666, 124656789000, 124690122333, 124723455666, 124756789000, 124790122333, 124823455666, 124856789000, 124890122333, 124923455666, 124956789000, 124990122333, 125023455666, 125056789000, 125090122333, 125123455666, 125156789000, 125190122333, 125223455666, 125256789000, 125290122333, 125323455666, 125356789000, 125390122333, 125423455666, 125456789000, 125490122333, 125523455666, 125556789000, 125590122333, 125623455666, 125656789000, 125690122333, 125723455666, 125756789000, 125790122333, 125823455666, 125856789000, 125890122333, 125923455666, 125956789000, 125990122333, 126023455666, 126056789000, 126090122333, 126123455666, 126156789000, 126190122333, 126223455666, 126256789000, 126290122333, 126323455666, 126356789000, 126390122333, 126423455666, 126456789000, 126490122333, 126523455666, 126556789000, 126590122333, 126623455666, 126656789000, 126690122333, 126723455666, 126756789000, 126790122333, 126823455666, 126856789000, 126890122333, 126923455666, 126956789000, 126990122333, 127023455666, 127056789000, 127090122333, 127123455666, 127156789000, 127190122333, 127223455666, 127256789000, 127290122333, 127323455666, 127356789000, 127390122333, 127423455666, 127456789000, 127490122333, 127523455666, 127556789000, 127590122333, 127623455666, 127656789000, 127690122333, 127723455666, 127756789000, 127790122333, 127823455666, 127856789000, 127890122333, 127923455666, 127956789000, 127990122333, 128023455666, 128056789000, 128090122333, 128123455666, 128156789000, 128190122333, 128223455666, 128256789000, 128290122333, 128323455666, 128356789000, 128390122333, 128423455666, 128456789000, 128490122333, 128523455666, 128556789000, 128590122333, 128623455666, 128656789000, 128690122333, 128723455666, 128756789000, 128790122333, 128823455666, 128856789000, 128890122333, 128923455666, 128956789000, 128990122333, 129023455666, 129056789000, 129090122333, 129123455666, 129156789000, 129190122333, 129223455666, 129256789000, 129290122333, 129323455666, 129356789000, 129390122333, 129423455666, 129456789000, 129490122333, 129523455666, 129556789000, 129590122333, 129623455666, 129656789000, 129690122333, 129723455666, 129756789000, 129790122333, 129823455666, 129856789000, 129890122333, 129923455666, 129956789000, 129990122333, 130023455666, 130056789000, 130090122333, 130123455666, 130156789000, 130190122333, 130223455666, 130256789000, 130290122333, 130323455666, 130356789000, 130390122333, 130423455666, 130456789000, 130490122333, 130523455666, 130556789000, 130590122333, 130623455666, 130656789000, 130690122333, 130723455666, 130756789000, 130790122333, 130823455666, 130856789000, 130890122333, 130923455666, 130956789000, 130990122333, 131023455666, 131056789000, 131090122333, 131123455666, 131156789000, 131190122333, 131223455666, 131256789000, 131290122333, 131323455666, 131356789000, 131390122333, 131423455666, 131456789000, 131490122333, 131523455666, 131556789000, 131590122333, 131623455666, 131656789000, 131690122333, 131723455666, 131756789000, 131790122333, 131823455666, 131856789000, 131890122333, 131923455666, 131956789000, 131990122333, 132023455666, 132056789000, 132090122333, 132123455666, 132156789000, 132190122333, 132223455666, 132256789000, 132290122333, 132323455666, 132356789000, 132390122333, 132423455666, 132456789000, 132490122333, 132523455666, 132556789000, 132590122333, 132623455666, 132656789000, 132690122333, 132723455666, 132756789000, 132790122333, 132823455666, 132856789000, 132890122333, 132923455666, 132956789000, 132990122333, 133023455666, 133056789000, 133090122333, 133123455666, 133156789000, 133190122333, 133223455666, 133256789000, 133290122333, 133323455666, 133356789000, 133390122333, 133423455666, 133456789000, 133490122333, 133523455666, 133556789000, 133590122333, 133623455666, 133656789000, 133690122333, 133723455666, 133756789000, 133790122333, 133823455666, 133856789000, 133890122333, 133923455666, 133956789000, 133990122333, 134023455666, 134056789000, 134090122333, 134123455666, 134156789000, 134190122333, 134223455666, 134256789000, 134290122333, 134323455666, 134356789000, 134390122333, 134423455666, 134456789000, 134490122333, 134523455666, 134556789000, 134590122333, 134623455666, 134656789000, 134690122333, 134723455666, 134756789000, 134790122333, 134823455666, 134856789000, 134890122333, 134923455666, 134956789000, 134990122333, 135023455666, 135056789000, 135090122333, 135123455666, 135156789000, 135190122333, 135223455666, 135256789000, 135290122333, 135323455666, 135356789000, 135390122333, 135423455666, 135456789000, 135490122333, 135523455666, 135556789000, 135590122333, 135623455666, 135656789000, 135690122333, 135723455666, 135756789000, 135790122333, 135823455666, 135856789000, 135890122333, 135923455666, 135956789000, 135990122333, 136023455666, 136056789000, 136090122333, 136123455666, 136156789000, 136190122333, 136223455666, 136256789000, 136290122333, 136323455666, 136356789000, 136390122333, 136423455666, 136456789000, 136490122333, 136523455666, 136556789000, 136590122333, 136623455666, 136656789000, 136690122333, 136723455666, 136756789000, 136790122333, 136823455666, 136856789000, 136890122333, 136923455666, 136956789000, 136990122333, 137023455666, 137056789000, 137090122333, 137123455666, 137156789000, 137190122333, 137223455666, 137256789000, 137290122333, 137323455666, 137356789000, 137390122333, 137423455666, 137456789000, 137490122333, 137523455666, 137556789000, 137590122333, 137623455666, 137656789000, 137690122333, 137723455666, 137756789000, 137790122333, 137823455666, 137856789000, 137890122333, 137923455666, 137956789000, 137990122333, 138023455666, 138056789000, 138090122333, 138123455666, 138156789000, 138190122333, 138223455666, 138256789000, 138290122333, 138323455666, 138356789000, 138390122333, 138423455666, 138456789000, 138490122333, 138523455666, 138556789000, 138590122333, 138623455666, 138656789000, 138690122333, 138723455666, 138756789000, 138790122333, 138823455666, 138856789000, 138890122333, 138923455666, 138956789000, 138990122333, 139023455666, 139056789000, 139090122333, 139123455666, 139156789000, 139190122333, 139223455666, 139256789000, 139290122333, 139323455666, 139356789000, 139390122333, 139423455666, 139456789000, 139490122333, 139523455666, 139556789000, 139590122333, 139623455666, 139656789000, 139690122333, 139723455666, 139756789000, 139790122333, 139823455666, 139856789000, 139890122333, 139923455666, 139956789000, 139990122333, 140023455666, 140056789000, 140090122333, 140123455666, 140156789000, 140190122333, 140223455666, 140256789000, 140290122333, 140323455666, 140356789000, 140390122333, 140423455666, 140456789000, 140490122333, 140523455666, 140556789000, 140590122333, 140623455666, 140656789000, 140690122333, 140723455666, 140756789000, 140790122333, 140823455666, 140856789000, 140890122333, 140923455666, 140956789000, 140990122333, 141023455666, 141056789000, 141090122333, 141123455666, 141156789000, 141190122333, 141223455666, 141256789000, 141290122333, 141323455666, 141356789000, 141390122333, 141423455666, 141456789000, 141490122333, 141523455666, 141556789000, 141590122333, 141623455666, 141656789000, 141690122333, 141723455666, 141756789000, 141790122333, 141823455666, 141856789000, 141890122333, 141923455666, 141956789000, 141990122333, 142023455666, 142056789000, 142090122333, 142123455666, 142156789000, 142190122333, 142223455666, 142256789000, 142290122333, 142323455666, 142356789000, 142390122333, 142423455666, 142456789000, 142490122333, 142523455666, 142556789000, 142590122333, 142623455666, 142656789000, 142690122333, 142723455666, 142756789000, 142790122333, 142823455666, 142856789000, 142890122333, 142923455666, 142956789000, 142990122333, 143023455666, 143056789000, 143090122333, 143123455666, 143156789000, 143190122333, 143223455666, 143256789000, 143290122333, 143323455666, 143356789000, 143390122333, 143423455666, 143456789000, 143490122333, 143523455666, 143556789000, 143590122333, 143623455666, 143656789000, 143690122333, 143723455666, 143756789000, 143790122333, 143823455666, 143856789000, 143890122333, 143923455666, 143956789000, 143990122333, 144023455666, 144056789000, 144090122333, 144123455666, 144156789000, 144190122333, 144223455666, 144256789000, 144290122333, 144323455666, 144356789000, 144390122333, 144423455666, 144456789000, 144490122333, 144523455666, 144556789000, 144590122333, 144623455666, 144656789000, 144690122333, 144723455666, 144756789000, 144790122333, 144823455666, 144856789000, 144890122333, 144923455666, 144956789000, 144990122333, 145023455666, 145056789000, 145090122333, 145123455666, 145156789000, 145190122333, 145223455666, 145256789000, 145290122333, 145323455666, 145356789000, 145390122333, 145423455666, 145456789000, 145490122333, 145523455666, 145556789000, 145590122333, 145623455666, 145656789000, 145690122333, 145723455666, 145756789000, 145790122333, 145823455666, 145856789000, 145890122333, 145923455666, 145956789000, 145990122333, 146023455666, 146056789000, 146090122333, 146123455666, 146156789000, 146190122333, 146223455666, 146256789000, 146290122333, 146323455666, 146356789000, 146390122333, 146423455666, 146456789000, 146490122333, 146523455666, 146556789000, 146590122333, 146623455666, 146656789000, 146690122333, 146723455666, 146756789000, 146790122333, 146823455666, 146856789000, 146890122333, 146923455666, 146956789000, 146990122333, 147023455666, 147056789000, 147090122333, 147123455666, 147156789000, 147190122333, 147223455666, 147256789000, 147290122333, 147323455666, 147356789000, 147390122333, 147423455666, 147456789000, 147490122333, 147523455666, 147556789000, 147590122333, 147623455666, 147656789000, 147690122333, 147723455666, 147756789000, 147790122333, 147823455666, 147856789000, 147890122333, 147923455666, 147956789000, 147990122333, 148023455666, 148056789000, 148090122333, 148123455666, 148156789000, 148190122333, 148223455666, 148256789000, 148290122333, 148323455666, 148356789000, 148390122333, 148423455666, 148456789000, 148490122333, 148523455666, 148556789000, 148590122333, 148623455666, 148656789000, 148690122333, 148723455666, 148756789000, 148790122333, 148823455666, 148856789000, 148890122333, 148923455666, 148956789000, 148990122333, 149023455666, 149056789000, 149090122333, 149123455666, 149156789000, 149190122333, 149223455666, 149256789000, 149290122333, 149323455666, 149356789000, 149390122333, 149423455666, 149456789000, 149490122333, 149523455666, 149556789000, 149590122333, 149623455666, 149656789000, 149690122333, 149723455666, 149756789000, 149790122333, 149823455666, 149856789000, 149890122333, 149923455666, 149956789000, 149990122333, 150023455666, 150056789000, 150090122333, 150123455666, 150156789000, 150190122333, 150223455666, 150256789000, 150290122333, 150323455666, 150356789000, 150390122333, 150423455666, 150456789000, 150490122333, 150523455666, 150556789000, 150590122333, 150623455666, 150656789000, 150690122333, 150723455666, 150756789000, 150790122333, 150823455666, 150856789000, 150890122333, 150923455666, 150956789000, 150990122333, 151023455666, 151056789000, 151090122333, 151123455666, 151156789000, 151190122333, 151223455666, 151256789000, 151290122333, 151323455666, 151356789000, 151390122333, 151423455666, 151456789000, 151490122333, 151523455666, 151556789000, 151590122333, 151623455666, 151656789000, 151690122333, 151723455666, 151756789000, 151790122333, 151823455666, 151856789000, 151890122333, 151923455666, 151956789000, 151990122333, 152023455666, 152056789000, 152090122333, 152123455666, 152156789000, 152190122333, 152223455666, 152256789000, 152290122333, 152323455666, 152356789000, 152390122333, 152423455666, 152456789000, 152490122333, 152523455666, 152556789000, 152590122333, 152623455666, 152656789000, 152690122333, 152723455666, 152756789000, 152790122333, 152823455666, 152856789000, 152890122333, 152923455666, 152956789000, 152990122333, 153023455666, 153056789000, 153090122333, 153123455666, 153156789000, 153190122333, 153223455666, 153256789000, 153290122333, 153323455666, 153356789000, 153390122333, 153423455666, 153456789000, 153490122333, 153523455666, 153556789000, 153590122333, 153623455666, 153656789000, 153690122333, 153723455666, 153756789000, 153790122333, 153823455666, 153856789000, 153890122333, 153923455666, 153956789000, 153990122333, 154023455666, 154056789000, 154090122333, 154123455666, 154156789000, 154190122333, 154223455666, 154256789000, 154290122333, 154323455666, 154356789000, 154390122333, 154423455666, 154456789000, 154490122333, 154523455666, 154556789000, 154590122333, 154623455666, 154656789000, 154690122333, 154723455666, 154756789000, 154790122333, 154823455666, 154856789000, 154890122333, 154923455666, 154956789000, 154990122333, 155023455666, 155056789000, 155090122333, 155123455666, 155156789000, 155190122333, 155223455666, 155256789000, 155290122333, 155323455666, 155356789000, 155390122333, 155423455666, 155456789000, 155490122333, 155523455666, 155556789000, 155590122333, 155623455666, 155656789000, 155690122333, 155723455666, 155756789000, 155790122333, 155823455666, 155856789000, 155890122333, 155923455666, 155956789000, 155990122333, 156023455666, 156056789000, 156090122333, 156123455666, 156156789000, 156190122333, 156223455666, 156256789000, 156290122333, 156323455666, 156356789000, 156390122333, 156423455666, 156456789000, 156490122333, 156523455666, 156556789000, 156590122333, 156623455666, 156656789000, 156690122333, 156723455666, 156756789000, 156790122333, 156823455666, 156856789000, 156890122333, 156923455666, 156956789000, 156990122333, 157023455666, 157056789000, 157090122333, 157123455666, 157156789000, 157190122333, 157223455666, 157256789000, 157290122333, 157323455666, 157356789000, 157390122333, 157423455666, 157456789000, 157490122333, 157523455666, 157556789000, 157590122333, 157623455666, 157656789000, 157690122333, 157723455666, 157756789000, 157790122333, 157823455666, 157856789000, 157890122333, 157923455666, 157956789000, 157990122333, 158023455666, 158056789000, 158090122333, 158123455666, 158156789000, 158190122333, 158223455666, 158256789000, 158290122333, 158323455666, 158356789000, 158390122333, 158423455666, 158456789000, 158490122333, 158523455666, 158556789000, 158590122333, 158623455666, 158656789000, 158690122333, 158723455666, 158756789000, 158790122333, 158823455666, 158856789000, 158890122333, 158923455666, 158956789000, 158990122333, 159023455666, 159056789000, 159090122333, 159123455666, 159156789000, 159190122333, 159223455666, 159256789000, 159290122333, 159323455666, 159356789000, 159390122333, 159423455666, 159456789000, 159490122333, 159523455666, 159556789000, 159590122333, 159623455666, 159656789000, 159690122333, 159723455666, 159756789000, 159790122333, 159823455666, 159856789000, 159890122333, 159923455666, 159956789000, 159990122333, 160023455666, 160056789000, 160090122333, 160123455666, 160156789000, 160190122333, 160223455666, 160256789000, 160290122333, 160323455666, 160356789000, 160390122333, 160423455666, 160456789000, 160490122333, 160523455666, 160556789000, 160590122333, 160623455666, 160656789000, 160690122333, 160723455666, 160756789000, 160790122333, 160823455666, 160856789000, 160890122333, 160923455666, 160956789000, 160990122333, 161023455666, 161056789000, 161090122333, 161123455666, 161156789000, 161190122333, 161223455666, 161256789000, 161290122333, 161323455666, 161356789000, 161390122333, 161423455666, 161456789000, 161490122333, 161523455666, 161556789000, 161590122333, 161623455666, 161656789000, 161690122333, 161723455666, 161756789000, 161790122333, 161823455666, 161856789000, 161890122333, 161923455666, 161956789000, 161990122333, 162023455666, 162056789000, 162090122333, 162123455666, 162156789000, 162190122333, 162223455666, 162256789000, 162290122333, 162323455666, 162356789000, 162390122333, 162423455666, 162456789000, 162490122333, 162523455666, 162556789000, 162590122333, 162623455666, 162656789000, 162690122333, 162723455666, 162756789000, 162790122333, 162823455666, 162856789000, 162890122333, 162923455666, 162956789000, 162990122333, 163023455666, 163056789000, 163090122333, 163123455666, 163156789000, 163190122333, 163223455666, 163256789000, 163290122333, 163323455666, 163356789000, 163390122333, 163423455666, 163456789000, 163490122333, 163523455666, 163556789000, 163590122333, 163623455666, 163656789000, 163690122333, 163723455666, 163756789000, 163790122333, 163823455666, 163856789000, 163890122333, 163923455666, 163956789000, 163990122333, 164023455666, 164056789000, 164090122333, 164123455666, 164156789000, 164190122333, 164223455666, 164256789000, 164290122333, 164323455666, 164356789000, 164390122333, 164423455666, 164456789000, 164490122333, 164523455666, 164556789000, 164590122333, 164623455666, 164656789000, 164690122333, 164723455666, 164756789000, 164790122333, 164823455666, 164856789000, 164890122333, 164923455666, 164956789000, 164990122333, 165023455666, 165056789000, 165090122333, 165123455666, 165156789000, 165190122333, 165223455666, 165256789000, 165290122333, 165323455666, 165356789000, 165390122333, 165423455666, 165456789000, 165490122333, 165523455666, 165556789000, 165590122333, 165623455666, 165656789000, 165690122333, 165723455666, 165756789000, 165790122333, 165823455666, 165856789000, 165890122333, 165923455666, 165956789000, 165990122333, 166023455666, 166056789000, 166090122333, 166123455666, 166156789000, 166190122333, 166223455666, 166256789000, 166290122333, 166323455666, 166356789000, 166390122333, 166423455666, 166456789000, 166490122333, 166523455666, 166556789000, 166590122333, 166623455666, 166656789000, 166690122333, 166723455666, 166756789000, 166790122333, 166823455666, 166856789000, 166890122333, 166923455666, 166956789000, 166990122333, 167023455666, 167056789000, 167090122333, 167123455666, 167156789000, 167190122333, 167223455666, 167256789000, 167290122333, 167323455666, 167356789000, 167390122333, 167423455666, 167456789000, 167490122333, 167523455666, 167556789000, 167590122333, 167623455666, 167656789000, 167690122333, 167723455666, 167756789000, 167790122333, 167823455666, 167856789000, 167890122333, 167923455666, 167956789000, 167990122333, 168023455666, 168056789000, 168090122333, 168123455666, 168156789000, 168190122333, 168223455666, 168256789000, 168290122333, 168323455666, 168356789000, 168390122333, 168423455666, 168456789000, 168490122333, 168523455666, 168556789000, 168590122333, 168623455666, 168656789000, 168690122333, 168723455666, 168756789000, 168790122333, 168823455666, 168856789000, 168890122333, 168923455666, 168956789000, 168990122333, 169023455666, 169056789000, 169090122333, 169123455666, 169156789000, 169190122333, 169223455666, 169256789000, 169290122333, 169323455666, 169356789000, 169390122333, 169423455666, 169456789000, 169490122333, 169523455666, 169556789000, 169590122333, 169623455666, 169656789000, 169690122333, 169723455666, 169756789000, 169790122333, 169823455666, 169856789000, 169890122333, 169923455666, 169956789000, 169990122333, 170023455666, 170056789000, 170090122333, 170123455666, 170156789000, 170190122333, 170223455666, 170256789000, 170290122333, 170323455666, 170356789000, 170390122333, 170423455666, 170456789000, 170490122333, 170523455666, 170556789000, 170590122333, 170623455666, 170656789000, 170690122333, 170723455666, 170756789000, 170790122333, 170823455666, 170856789000, 170890122333, 170923455666, 170956789000, 170990122333, 171023455666, 171056789000, 171090122333, 171123455666, 171156789000, 171190122333, 171223455666, 171256789000, 171290122333, 171323455666, 171356789000, 171390122333, 171423455666, 171456789000, 171490122333, 171523455666, 171556789000, 171590122333, 171623455666, 171656789000, 171690122333, 171723455666, 171756789000, 171790122333, 171823455666, 171856789000, 171890122333, 171923455666, 171956789000, 171990122333, 172023455666, 172056789000, 172090122333, 172123455666, 172156789000, 172190122333, 172223455666, 172256789000, 172290122333, 172323455666, 172356789000, 172390122333, 172423455666, 172456789000, 172490122333, 172523455666, 172556789000, 172590122333, 172623455666, 172656789000, 172690122333, 172723455666, 172756789000, 172790122333, 172823455666, 172856789000, 172890122333, 172923455666, 172956789000, 172990122333, 173023455666, 173056789000, 173090122333, 173123455666, 173156789000, 173190122333, 173223455666, 173256789000, 173290122333, 173323455666, 173356789000, 173390122333, 173423455666, 173456789000, 173490122333, 173523455666, 173556789000, 173590122333, 173623455666, 173656789000, 173690122333, 173723455666, 173756789000, 173790122333, 173823455666, 173856789000, 173890122333, 173923455666, 173956789000, 173990122333, 174023455666, 174056789000, 174090122333, 174123455666, 174156789000, 174190122333, 174223455666, 174256789000, 174290122333, 174323455666, 174356789000, 174390122333, 174423455666, 174456789000, 174490122333, 174523455666, 174556789000, 174590122333, 174623455666, 174656789000, 174690122333, 174723455666, 174756789000, 174790122333, 174823455666, 174856789000, 174890122333, 174923455666, 174956789000, 174990122333, 175023455666, 175056789000, 175090122333, 175123455666, 175156789000, 175190122333, 175223455666, 175256789000, 175290122333, 175323455666, 175356789000, 175390122333, 175423455666, 175456789000, 175490122333, 175523455666, 175556789000, 175590122333, 175623455666, 175656789000, 175690122333, 175723455666, 175756789000, 175790122333, 175823455666, 175856789000, 175890122333, 175923455666, 175956789000, 175990122333, 176023455666, 176056789000, 176090122333, 176123455666, 176156789000, 176190122333, 176223455666, 176256789000, 176290122333, 176323455666, 176356789000, 176390122333, 176423455666, 176456789000, 176490122333, 176523455666, 176556789000, 176590122333, 176623455666, 176656789000, 176690122333, 176723455666, 176756789000, 176790122333, 176823455666, 176856789000, 176890122333, 176923455666, 176956789000, 176990122333, 177023455666, 177056789000, 177090122333, 177123455666, 177156789000, 177190122333, 177223455666, 177256789000, 177290122333, 177323455666, 177356789000, 177390122333, 177423455666, 177456789000, 177490122333, 177523455666, 177556789000, 177590122333, 177623455666, 177656789000, 177690122333, 177723455666, 177756789000, 177790122333, 177823455666, 177856789000, 177890122333, 177923455666, 177956789000, 177990122333, 178023455666, 178056789000, 178090122333, 178123455666, 178156789000, 178190122333, 178223455666, 178256789000, 178290122333, 178323455666, 178356789000, 178390122333, 178423455666, 178456789000, 178490122333, 178523455666, 178556789000, 178590122333, 178623455666, 178656789000, 178690122333, 178723455666, 178756789000, 178790122333, 178823455666, 178856789000, 178890122333, 178923455666, 178956789000, 178990122333, 179023455666, 179056789000, 179090122333, 179123455666, 179156789000, 179190122333, 179223455666, 179256789000, 179290122333, 179323455666, 179356789000, 179390122333, 179423455666, 179456789000, 179490122333, 179523455666, 179556789000, 179590122333, 179623455666, 179656789000, 179690122333, 179723455666, 179756789000, 179790122333, 179823455666, 179856789000, 179890122333, 179923455666, 179956789000, 179990122333, 180023455666, 180056789000, 180090122333, 180123455666, 180156789000, 180190122333, 180223455666, 180256789000, 180290122333, 180323455666, 180356789000, 180390122333, 180423455666, 180456789000, 180490122333, 180523455666, 180556789000, 180590122333, 180623455666, 180656789000, 180690122333, 180723455666, 180756789000, 180790122333, 180823455666, 180856789000, 180890122333, 180923455666, 180956789000, 180990122333, 181023455666, 181056789000, 181090122333, 181123455666, 181156789000, 181190122333, 181223455666, 181256789000, 181290122333, 181323455666, 181356789000, 181390122333, 181423455666, 181456789000, 181490122333, 181523455666, 181556789000, 181590122333, 181623455666, 181656789000, 181690122333, 181723455666, 181756789000, 181790122333, 181823455666, 181856789000, 181890122333, 181923455666, 181956789000, 181990122333, 182023455666, 182056789000, 182090122333, 182123455666, 182156789000, 182190122333, 182223455666, 182256789000, 182290122333, 182323455666, 182356789000, 182390122333, 182423455666, 182456789000, 182490122333, 182523455666, 182556789000, 182590122333, 182623455666, 182656789000, 182690122333, 182723455666, 182756789000, 182790122333, 182823455666, 182856789000, 182890122333, 182923455666, 182956789000, 182990122333, 183023455666, 183056789000, 183090122333, 183123455666, 183156789000, 183190122333, 183223455666, 183256789000, 183290122333, 183323455666, 183356789000, 183390122333, 183423455666, 183456789000, 183490122333, 183523455666, 183556789000, 183590122333, 183623455666, 183656789000, 183690122333, 183723455666, 183756789000, 183790122333, 183823455666, 183856789000, 183890122333, 183923455666, 183956789000, 183990122333, 184023455666, 184056789000, 184090122333, 184123455666, 184156789000, 184190122333, 184223455666, 184256789000, 184290122333, 184323455666, 184356789000, 184390122333, 184423455666, 184456789000, 184490122333, 184523455666, 184556789000, 184590122333, 184623455666, 184656789000, 184690122333, 184723455666, 184756789000, 184790122333, 184823455666, 184856789000, 184890122333, 184923455666, 184956789000, 184990122333, 185023455666, 185056789000, 185090122333, 185123455666, 185156789000, 185190122333, 185223455666, 185256789000, 185290122333, 185323455666, 185356789000, 185390122333, 185423455666, 185456789000, 185490122333, 185523455666, 185556789000, 185590122333, 185623455666, 185656789000, 185690122333, 185723455666, 185756789000, 185790122333, 185823455666, 185856789000, 185890122333, 185923455666, 185956789000, 185990122333, 186023455666, 186056789000, 186090122333, 186123455666, 186156789000, 186190122333, 186223455666, 186256789000, 186290122333, 186323455666, 186356789000, 186390122333, 186423455666, 186456789000, 186490122333, 186523455666, 186556789000, 186590122333, 186623455666, 186656789000, 186690122333, 186723455666, 186756789000, 186790122333, 186823455666, 186856789000, 186890122333, 186923455666, 186956789000, 186990122333, 187023455666, 187056789000, 187090122333, 187123455666, 187156789000, 187190122333, 187223455666, 187256789000, 187290122333, 187323455666, 187356789000, 187390122333, 187423455666, 187456789000, 187490122333, 187523455666, 187556789000, 187590122333, 187623455666, 187656789000, 187690122333, 187723455666, 187756789000, 187790122333, 187823455666, 187856789000, 187890122333, 187923455666, 187956789000, 187990122333, 188023455666, 188056789000, 188090122333, 188123455666, 188156789000, 188190122333, 188223455666, 188256789000, 188290122333, 188323455666, 188356789000, 188390122333, 188423455666, 188456789000, 188490122333, 188523455666, 188556789000, 188590122333, 188623455666, 188656789000, 188690122333, 188723455666, 188756789000, 188790122333, 188823455666, 188856789000, 188890122333, 188923455666, 188956789000, 188990122333, 189023455666, 189056789000, 189090122333, 189123455666, 189156789000, 189190122333, 189223455666, 189256789000, 189290122333, 189323455666, 189356789000, 189390122333, 189423455666, 189456789000, 189490122333, 189523455666, 189556789000, 189590122333, 189623455666, 189656789000, 189690122333, 189723455666, 189756789000, 189790122333, 189823455666, 189856789000, 189890122333, 189923455666, 189956789000, 189990122333, 190023455666, 190056789000, 190090122333, 190123455666, 190156789000, 190190122333, 190223455666, 190256789000, 190290122333, 190323455666, 190356789000, 190390122333, 190423455666, 190456789000, 190490122333, 190523455666, 190556789000, 190590122333, 190623455666, 190656789000, 190690122333, 190723455666, 190756789000, 190790122333, 190823455666, 190856789000, 190890122333, 190923455666, 190956789000, 190990122333, 191023455666, 191056789000, 191090122333, 191123455666, 191156789000, 191190122333, 191223455666, 191256789000, 191290122333, 191323455666, 191356789000, 191390122333, 191423455666, 191456789000, 191490122333, 191523455666, 191556789000, 191590122333, 191623455666, 191656789000, 191690122333, 191723455666, 191756789000, 191790122333, 191823455666, 191856789000, 191890122333, 191923455666, 191956789000, 191990122333, 192023455666, 192056789000, 192090122333, 192123455666, 192156789000, 192190122333, 192223455666, 192256789000, 192290122333, 192323455666, 192356789000, 192390122333, 192423455666, 192456789000, 192490122333, 192523455666, 192556789000, 192590122333, 192623455666, 192656789000, 192690122333, 192723455666, 192756789000, 192790122333, 192823455666, 192856789000, 192890122333, 192923455666, 192956789000, 192990122333, 193023455666, 193056789000, 193090122333, 193123455666, 193156789000, 193190122333, 193223455666, 193256789000, 193290122333, 193323455666, 193356789000, 193390122333, 193423455666], "frame_exposure_ns": [1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000, 1000000], "frame_duration_ns": [33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333, 33333333], "rolling_shutter_skew_ns": 25000000, "iso": 800, "wall_clock_start_utc": "2026-01-20T10:00:00+00:00", "wall_clock_source": "simulator", "sensor_timestamp_wall_offset_ns": 1768903076543211000, "zone": "SIM50", "video_sha256": "b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779"} \ No newline at end of file diff --git a/results/aws/e2e011233/trace.json b/results/aws/e2e011233/trace.json new file mode 100644 index 0000000..c7d17d9 --- /dev/null +++ b/results/aws/e2e011233/trace.json @@ -0,0 +1,145 @@ +{ + "job_id": "e2e011233", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T02:51:40.288868+00:00", + "t_end": "2026-10-27T02:51:43.562312+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"e2e011233\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2100,\"bitrate\":475816,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.2734, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T02:51:43.562651+00:00", + "t_end": "2026-10-27T02:51:44.432731+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"e2e011233\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.8701, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T02:51:44.433070+00:00", + "t_end": "2026-10-27T02:51:54.017465+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"e2e011233\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1116,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"e2e011233:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.5844, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T02:51:54.017819+00:00", + "t_end": "2026-10-27T02:51:57.179979+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"e2e011233\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\":18.75},{\"id\":39,\"score_db\":18.67}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.1622, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T02:51:57.180376+00:00", + "t_end": "2026-10-27T02:51:58.820898+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"e2e011233\",\"nominal_hz\":60,\"patch_ids\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30],\"axis\":\"rows+\",\"frame_subset\":\"\"}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":0.363,\"axis\":\"rows+\",\"nominal_flicker_hz\":120.0,\"frames_used\":2100,\"track_samples\":66,\"mean_flicker_hz\":130.02598,\"dft_peak_hz\":120.02815,\"estimators_agree\":false,\"reasons\":[\"SIGNAL_ABSENT\"],\"candidates\":{\"rows+@120\":0.39}}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.6405, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T02:51:58.821279+00:00", + "t_end": "2026-10-27T02:51:59.923707+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"e2e011233\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\":18.75},{\"id\":39,\"score_db\":18.67}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.1024, + "error": null, + "policy_note": null + }, + { + "index": 6, + "t_start": "2026-10-27T02:51:59.924137+00:00", + "t_end": "2026-10-27T02:52:00.848192+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"e2e011233\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\":18.75},{\"id\":39,\"score_db\":18.67}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.9241, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T02:52:00.848632+00:00", + "t_end": "2026-10-27T02:52:01.576486+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "request_user_input", + "input_summary": "{\"job_id\":\"e2e011233\",\"kind\":\"original_file\",\"message\":\"The signal was absent in the initial extraction. Please provide the original file if available.\"}", + "output_summary": "{\"request_id\":\"e2e011233:original_file\",\"status\":\"open\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.7279, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T02:52:01.576933+00:00", + "t_end": "2026-10-27T02:52:02.682998+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"e2e011233\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"SIGNAL_ABSENT\",\"READOUT_FROM_SIDECAR\",\"USER_INPUT_REQUESTED\"],\"rule\":\"S13.1\"}", + "decision_reason": "policy: compute_verdict is required before stopping", + "duration_s": 1.1061, + "error": null, + "policy_note": "stop before verdict" + }, + { + "index": 9, + "t_start": "2026-10-27T02:52:02.683447+00:00", + "t_end": "2026-10-27T02:52:27.098592+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"e2e011233\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/e2e011233/overlay.mp4\",\"report_html\":\"/app/work/jobs/e2e011233/report.html\",\"report_pdf\":\"/app/work/jobs/e2e011233/report.pdf\",\"report_json\":\"/app/work/jobs/e2e011233/result.json\",\"plot_enf_track\":\"/app/work/jobs/e2e011233/enf_track.png\",\"plot_band_amplitude\":\"/app/work/jobs/e2e011233/band_amplitude.png\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "policy: report must be rendered", + "duration_s": 24.4151, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/e5e8643a8662/band_amplitude.png b/results/aws/e5e8643a8662/band_amplitude.png new file mode 100644 index 0000000..bd7aabb Binary files /dev/null and b/results/aws/e5e8643a8662/band_amplitude.png differ diff --git a/results/aws/e5e8643a8662/enf_track.png b/results/aws/e5e8643a8662/enf_track.png new file mode 100644 index 0000000..0b4d101 Binary files /dev/null and b/results/aws/e5e8643a8662/enf_track.png differ diff --git a/results/aws/e5e8643a8662/ncc_scan.png b/results/aws/e5e8643a8662/ncc_scan.png new file mode 100644 index 0000000..7715672 Binary files /dev/null and b/results/aws/e5e8643a8662/ncc_scan.png differ diff --git a/results/aws/e5e8643a8662/phase_residual.png b/results/aws/e5e8643a8662/phase_residual.png new file mode 100644 index 0000000..fa96e0d Binary files /dev/null and b/results/aws/e5e8643a8662/phase_residual.png differ diff --git a/results/aws/e5e8643a8662/plots.json b/results/aws/e5e8643a8662/plots.json new file mode 100644 index 0000000..725fc7b --- /dev/null +++ b/results/aws/e5e8643a8662/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "phase_residual.png", "alt": "Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.", "caption": "Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/e5e8643a8662/report.html b/results/aws/e5e8643a8662/report.html new file mode 100644 index 0000000..552d7f7 --- /dev/null +++ b/results/aws/e5e8643a8662/report.html @@ -0,0 +1,95 @@ + + + + + +GRIDPRINT report e5e8643a8662 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T10:00:00.014252+00:00 ± 1.5 s
Grid zoneSIM50
Reasons
  • READOUT_FROM_SIDECAR — Readout time came from the Capture sidecar.
  • MATCH_OK — The track matches the reference log at one time.
  • DROPPED_FRAMES_EXPLAINED — Frame gaps were found; the flicker phase across them is consistent (not an edit).
Matchpeak correlation 0.980, next peak 0.784, track length 69 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.
Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-25697bd81ea29c2a33b16465d912f7ac4e526a0425b1cc54b33e27aeb10b46074b9
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash0161b96f77d3e925
Jobe5e8643a8662
+
+ +
+

Appendix

+

Continuity events

+ +
KindTime in video (s)Phase jump (rad)Significance
DROPPED_FRAMES_EXPLAINED20.20-0.0330.6
DROPPED_FRAMES_EXPLAINED43.630.0200.3
+ +

Quality metrics

+
axisrows+
band_snr_db11.426580954399864
bitrate490747
bits_per_pixel0.21453018834932053
camera_motion_px0.032422965009069944
codech264
dft_peak_hz100.02934814260769
estimators_agreeTrue
foreground_fraction0.052121927458033575
frames2085
height240
jitter_p50_ms3.3305269653283176e-07
jitter_p95_ms3.338056941970535e-07
motion_level_px0.10989784047152439
nominal_flicker_hz100.0
opencv_frame_count2085
phase_mean_flicker_hz100.0261382279723
readout_s0.025
readout_sourceREADOUT_FROM_SIDECAR
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcesensor
timing_assumptionsensor_timestamp_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.2984
S2_linear2.1164
S3_readout0.0
S4_motion6.3535
S5_segment0.9316
S7_rowsignal1.1869
S6_patches1.482
S8_phase0.7538
S10_match0.6674
S11_continuity0.0009
+
+
+ + \ No newline at end of file diff --git a/results/aws/e5e8643a8662/report.pdf b/results/aws/e5e8643a8662/report.pdf new file mode 100644 index 0000000..b8d94d5 Binary files /dev/null and b/results/aws/e5e8643a8662/report.pdf differ diff --git a/results/aws/e5e8643a8662/result.json b/results/aws/e5e8643a8662/result.json new file mode 100644 index 0000000..10c0074 --- /dev/null +++ b/results/aws/e5e8643a8662/result.json @@ -0,0 +1,199 @@ +{ + "job_id": "e5e8643a8662", + "file_sha256": "97bd81ea29c2a33b16465d912f7ac4e526a0425b1cc54b33e27aeb10b46074b9", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "DROPPED_FRAMES_EXPLAINED" + ], + "time_estimate_utc": 1768903200.0142524, + "time_estimate_iso": "2026-01-20T10:00:00.014252+00:00", + "time_uncertainty_s": 1.5405208068860503, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768899600.0, + "window_end_utc": 1768906800.0, + "best_offset_utc": 1768903200.0142524, + "rho1": 0.9800703970913697, + "rho2": 0.7844111609436265, + "margin": 0.19565923614774317, + "psr": 3.0627806275890603, + "track_length_s": 69.0, + "time_uncertainty_s": 1.5405208068860503, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.6992779, + "rho1": 0.9789072475146381, + "margin": 0.04652485261357009, + "passes": true + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.3011754, + "rho1": 0.9859480845233223, + "margin": 0.02264086404046306, + "passes": true + } + ], + "segments_consistent": true + }, + "continuity_events": [ + { + "kind": "DROPPED_FRAMES_EXPLAINED", + "frame_index": 600, + "t_s": 20.19999999999999, + "magnitude_rad": -0.03309346827316251, + "significance": 0.6125052027153908, + "significant": false, + "gap_s": 0.20000000100000648 + }, + { + "kind": "DROPPED_FRAMES_EXPLAINED", + "frame_index": 1294, + "t_s": 43.633333332999996, + "magnitude_rad": 0.01958448362225873, + "significance": 0.2912458143353985, + "significant": false, + "gap_s": 0.30000000000001137 + } + ], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2085, + "bitrate": 490747, + "bits_per_pixel": 0.21453018834932053, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "sensor", + "jitter_p50_ms": 3.3305269653283176e-07, + "jitter_p95_ms": 3.338056941970535e-07, + "timing_assumption": "sensor_timestamp_is_first_row_exposure_start", + "opencv_frame_count": 2085, + "gaps": [ + { + "frame_index": 600, + "t_s": 20.19999999999999, + "size_s": 0.20000000100000648 + }, + { + "frame_index": 1294, + "t_s": 43.633333332999996, + "size_s": 0.30000000000001137 + } + ], + "readout_s": 0.025, + "readout_source": "READOUT_FROM_SIDECAR", + "motion_level_px": 0.10989784047152439, + "camera_motion_px": 0.032422965009069944, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.052121927458033575, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 11.426580954399864, + "estimators_agree": true, + "dft_peak_hz": 100.02934814260769, + "phase_mean_flicker_hz": 100.0261382279723, + "patch_ids": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ], + "track_samples": 66, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.2984, + "S2_linear": 2.1164, + "S3_readout": 0.0, + "S4_motion": 6.3535, + "S5_segment": 0.9316, + "S7_rowsignal": 1.1869, + "S6_patches": 1.482, + "S8_phase": 0.7538, + "S10_match": 0.6674, + "S11_continuity": 0.0009, + "S14_overlay": 35.8875, + "S15_report": 0.985 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/e5e8643a8662/overlay.mp4", + "report_html": "/app/work/jobs/e5e8643a8662/report.html", + "report_pdf": "/app/work/jobs/e5e8643a8662/report.pdf", + "report_json": "/app/work/jobs/e5e8643a8662/result.json", + "plot_enf_track": "/app/work/jobs/e5e8643a8662/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/e5e8643a8662/ncc_scan.png", + "plot_phase_residual": "/app/work/jobs/e5e8643a8662/phase_residual.png", + "plot_band_amplitude": "/app/work/jobs/e5e8643a8662/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/e5e8643a8662/trace.json b/results/aws/e5e8643a8662/trace.json new file mode 100644 index 0000000..cb886da --- /dev/null +++ b/results/aws/e5e8643a8662/trace.json @@ -0,0 +1,145 @@ +{ + "job_id": "e5e8643a8662", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T05:20:44.635784+00:00", + "t_end": "2026-10-27T05:20:48.359851+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"e5e8643a8662\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2085,\"bitrate\":490747,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":2,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.7241, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T05:20:48.360150+00:00", + "t_end": "2026-10-27T05:20:48.834729+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.4746, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T05:20:48.835565+00:00", + "t_end": "2026-10-27T05:20:57.958290+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1099,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"e5e8643a8662:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.1227, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T05:20:57.958625+00:00", + "t_end": "2026-10-27T05:20:59.860308+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,62,61,23,15,37,35,36,31,29,25,22,30],\"ranked\":[{\"id\":63,\"score_db\":20.59},{\"id\":53,\"score_db\":20.07},{\"id\":62,\"score_db\":19.68},{\"id\":61,\"score_db\":19.66},{\"id\":23,\"score_db\":19.52},{\"id\":15,\"score_db\":19.52},{\"id\":37,\"score_db\":19.36},{\"id\":35,\"score_db\":19.33},{\"id\":36,\"score_db\":19.24},{\"id\":31,\"score_db\":19.13},{\"id\":29,\"score_db\":19.06},{\"id\":25,\"score_db\":19.01},{\"id\":22,\"score_db\":18.96},{\"id\":30,\"score_db\":18.89},{\"id\":54,\"score_db\":18.84},{\"id\":10,\"score_db\":18.8}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.9017, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T05:20:59.860691+00:00", + "t_end": "2026-10-27T05:21:01.259764+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":63,\"score_db\":20.59},{\"id\":53,\"score_db\":20.07},{\"id\":62,\"score_db\":19.68},{\"id\":61,\"score_db\":19.66},{\"id\":23,\"score_db\":19.52},{\"id\":15,\"score_db\":19.52},{\"id\":37,\"score_db\":19.36},{\"id\":35,\"score_db\":19.33},{\"id\":36,\"score_db\":19.24},{\"id\":31,\"score_db\":19.13},{\"id\":29,\"score_db\":19.06},{\"id\":25,\"score_db\":19.01},{\"id\":22,\"score_db\":18.96},{\"id\":30,\"score_db\":18.89},{\"id\":54,\"score_d...", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 60, 'patch_ids': [63, 53, 62, 61, 23, 15, 37, 35, 36, 31, 29, 25, 22, 30], 'axis': 'rows+'} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 1.3991, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T05:21:01.260166+00:00", + "t_end": "2026-10-27T05:21:03.317776+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"patch_ids\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.427,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2085,\"track_samples\":66,\"mean_flicker_hz\":100.02614,\"dft_peak_hz\":100.02935,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.46}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [63, 53, 62, 61, 23, 15, 37, 35, 36, 31, 29, 25, 22, 30]} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 2.0576, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T05:21:03.318219+00:00", + "t_end": "2026-10-27T05:21:04.567908+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903200.0142524,\"rho1\":0.9800703970913697,\"rho2\":0.7844111609436265,\"margin\":0.19565923614774317,\"psr\":3.0627806275890603,\"track_length_s\":69.0,\"time_uncertainty_s\":1.5405208068860503,\"segments_consistent\":true,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.2497, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T05:21:04.568365+00:00", + "t_end": "2026-10-27T05:21:05.100384+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[{\"kind\":\"DROPPED_FRAMES_EXPLAINED\",\"frame_index\":600,\"t_s\":20.19999999999999,\"magnitude_rad\":-0.03309346827316251,\"significance\":0.6125052027153908,\"significant\":false,\"gap_s\":0.20000000100000648},{\"kind\":\"DROPPED_FRAMES_EXPLAINED\",\"frame_index\":1294,\"t_s\":43.633333332999996,\"magnitude_rad\":0.01958448362225873,\"significance\":0.2912458143353985,\"significant\":false,\"gap_s\":0.30000000000001137}],\"edit_candidates\":0,\"dropped_explained\":2,\"reasons\":[\"DROPPED_FRAMES_EXPLAINED\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.532, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T05:21:05.100831+00:00", + "t_end": "2026-10-27T05:21:06.237457+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"e5e8643a8662\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"MATCH_OK\",\"DROPPED_FRAMES_EXPLAINED\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.1366, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T05:21:06.237916+00:00", + "t_end": "2026-10-27T05:21:43.765851+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"e5e8643a8662\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/e5e8643a8662/overlay.mp4\",\"report_html\":\"/app/work/jobs/e5e8643a8662/report.html\",\"report_pdf\":\"/app/work/jobs/e5e8643a8662/report.pdf\",\"report_json\":\"/app/work/jobs/e5e8643a8662/result.json\",\"plot_enf_track\":\"/app/work/jobs/e5e8643a8662/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/e5e8643a8662/ncc_scan.png\",\"plot_phase_residual\":\"/app/work/jobs/e5e8643a8662/phase_residual.png\",\"plot_band_amplitude\":\"/app/work/jobs/e5e8643a8662/band_amplitude.png\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "policy: report must be rendered", + "duration_s": 37.5279, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/ea0208da7833/result.json b/results/aws/ea0208da7833/result.json new file mode 100644 index 0000000..e428340 --- /dev/null +++ b/results/aws/ea0208da7833/result.json @@ -0,0 +1,113 @@ +{ + "job_id": "ea0208da7833", + "file_sha256": "6b4aa9992a15b17b97d335c5c8819f518dc8c8a76436268f5347b1918077d109", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "DRAFT", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": { + "zone": "SIM50", + "window_start_utc": 1768902600.0, + "window_end_utc": 1768903800.0, + "best_offset_utc": 1768902991.9706717, + "rho1": 0.4104500979526091, + "rho2": 0.3445509767912343, + "margin": 0.06589912116137481, + "psr": 2.6183283128114296, + "track_length_s": 68.0, + "time_uncertainty_s": 1.9151166350580942, + "passes": false, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903354.9731207, + "rho1": 0.7853937249653182, + "margin": 0.10210884385250085, + "passes": false + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768902724.651265, + "rho1": 0.7418362904422628, + "margin": 0.006351925751931997, + "passes": false + } + ], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2062, + "bitrate": 470459, + "bits_per_pixel": 0.20419227430555556, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "pts", + "jitter_p50_ms": 4.263256414560601e-11, + "jitter_p95_ms": 7.194245199571014e-11, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 2062, + "gaps": [], + "readout_s": 0.025285470085468713, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 0.11164687214327029, + "camera_motion_px": 0.033848655853099534, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.0527948947219528, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 8.051949402243615, + "estimators_agree": true, + "dft_peak_hz": 100.01950478796283, + "phase_mean_flicker_hz": 100.01962750890974, + "patch_ids": [ + 35, + 53, + 37, + 23, + 36, + 31, + 30, + 25, + 29, + 15, + 39, + 34, + 28, + 22 + ], + "track_samples": 65, + "verdict_rule": "S13.5" + }, + "stage_timings_s": { + "S1_ingest": 0.299, + "S2_linear": 2.0913, + "S7_rowsignal": 2.3051, + "S3_readout": 4.2851, + "S4_motion": 6.4261, + "S5_segment": 0.9533, + "S6_patches": 3.1052, + "S8_phase": 2.3565, + "S10_match": 0.2061 + }, + "artifacts": {}, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/ea0208da7833/trace.json b/results/aws/ea0208da7833/trace.json new file mode 100644 index 0000000..aa9f6ca --- /dev/null +++ b/results/aws/ea0208da7833/trace.json @@ -0,0 +1,117 @@ +{ + "job_id": "ea0208da7833", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T05:19:15.351300+00:00", + "t_end": "2026-10-27T05:19:19.185322+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"ea0208da7833\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2062,\"bitrate\":470459,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"pts\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":false,\"notes\":[],\"axis_info\":\"unknown: both axes tested in S8\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.834, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T05:19:19.185638+00:00", + "t_end": "2026-10-27T05:19:23.915389+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"ea0208da7833\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025285470085468713,\"source\":\"READOUT_ESTIMATED\",\"confidence\":0.9253,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 4.7298, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T05:19:23.916636+00:00", + "t_end": "2026-10-27T05:19:33.025571+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"ea0208da7833\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1116,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"ea0208da7833:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.1089, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T05:19:33.025924+00:00", + "t_end": "2026-10-27T05:19:36.599661+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"ea0208da7833\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[35,53,37,23,36,31,30,25,29,15,39,34,28,22],\"ranked\":[{\"id\":35,\"score_db\":19.5},{\"id\":53,\"score_db\":19.44},{\"id\":37,\"score_db\":19.4},{\"id\":23,\"score_db\":19.31},{\"id\":36,\"score_db\":19.3},{\"id\":31,\"score_db\":19.17},{\"id\":30,\"score_db\":19.0},{\"id\":25,\"score_db\":18.96},{\"id\":29,\"score_db\":18.93},{\"id\":15,\"score_db\":18.88},{\"id\":39,\"score_db\":18.79},{\"id\":34,\"score_db\":18.76},{\"id\":28,\"score_db\":18.63},{\"id\":22,\"score_db\":18.57},{\"id\":27,\"score_db\":18.49},{\"id\":43,\"score_db\":18.36}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.5737, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T05:19:36.600031+00:00", + "t_end": "2026-10-27T05:19:39.738973+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"ea0208da7833\",\"patch_ids\":[35,53,37,23,36,31,30,25,29,15,39,34,28,22]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":8.052,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2062,\"track_samples\":65,\"mean_flicker_hz\":100.01963,\"dft_peak_hz\":100.0195,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":8.06,\"cols-@100\":-11.17,\"cols+@100\":-11.17,\"rows-@100\":8.06}}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.1389, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T05:19:39.739362+00:00", + "t_end": "2026-10-27T05:19:40.405286+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"ea0208da7833\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":false,\"best_offset_utc\":1768902991.9706717,\"rho1\":0.4104500979526091,\"rho2\":0.3445509767912343,\"margin\":0.06589912116137481,\"psr\":2.6183283128114296,\"track_length_s\":68.0,\"time_uncertainty_s\":1.9151166350580942,\"segments_consistent\":null,\"reasons\":[\"NO_UNIQUE_MATCH\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6659, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T05:19:40.405686+00:00", + "t_end": "2026-10-27T05:19:41.071556+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"ea0208da7833\"}", + "output_summary": "{\"verdict\":\"INCONCLUSIVE\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_ESTIMATED\",\"NO_UNIQUE_MATCH\"],\"rule\":\"S13.5\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.6659, + "error": null, + "policy_note": null + }, + { + "index": 7, + "t_start": "2026-10-27T05:19:41.071964+00:00", + "t_end": "2026-10-27T05:19:41.443700+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "(stop)", + "input_summary": "{}", + "output_summary": "{}", + "decision_reason": "policy: review only for CONTRADICTED", + "duration_s": 0.3717, + "error": null, + "policy_note": "review blocked" + } + ] +} \ No newline at end of file diff --git a/results/aws/f2f2bda20247/band_amplitude.png b/results/aws/f2f2bda20247/band_amplitude.png new file mode 100644 index 0000000..4174d6c Binary files /dev/null and b/results/aws/f2f2bda20247/band_amplitude.png differ diff --git a/results/aws/f2f2bda20247/enf_track.png b/results/aws/f2f2bda20247/enf_track.png new file mode 100644 index 0000000..ad5799c Binary files /dev/null and b/results/aws/f2f2bda20247/enf_track.png differ diff --git a/results/aws/f2f2bda20247/ncc_scan.png b/results/aws/f2f2bda20247/ncc_scan.png new file mode 100644 index 0000000..dd21e67 Binary files /dev/null and b/results/aws/f2f2bda20247/ncc_scan.png differ diff --git a/results/aws/f2f2bda20247/phase_residual.png b/results/aws/f2f2bda20247/phase_residual.png new file mode 100644 index 0000000..deedce6 Binary files /dev/null and b/results/aws/f2f2bda20247/phase_residual.png differ diff --git a/results/aws/f2f2bda20247/plots.json b/results/aws/f2f2bda20247/plots.json new file mode 100644 index 0000000..725fc7b --- /dev/null +++ b/results/aws/f2f2bda20247/plots.json @@ -0,0 +1 @@ +[{"file": "enf_track.png", "alt": "Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.", "caption": "Measured grid frequency variation and matched reference."}, {"file": "ncc_scan.png", "alt": "Normalized correlation between the video track and the reference for every candidate start time in the search window.", "caption": "Correlation against candidate start times."}, {"file": "phase_residual.png", "alt": "Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.", "caption": "Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap."}, {"file": "band_amplitude.png", "alt": "Fitted flicker band amplitude for each frame.", "caption": "Flicker band amplitude per frame (fractional modulation)."}] \ No newline at end of file diff --git a/results/aws/f2f2bda20247/report.html b/results/aws/f2f2bda20247/report.html new file mode 100644 index 0000000..2b9c6ad --- /dev/null +++ b/results/aws/f2f2bda20247/report.html @@ -0,0 +1,93 @@ + + + + + +GRIDPRINT report f2f2bda20247 + + + +
+

GRIDPRINT analysis report

+
+

Verdict

+
+ +
+
VERIFIED
+
A grid signal is present and matches the reference log at one time. No significant edit evidence was found.
+
Report state: FINAL
+
+
+
+ +
+

Summary

+ + + + + +
Estimated recording start (UTC)2026-01-20T10:00:00.020533+00:00 ± 1.5 s
Grid zoneSIM50
Reasons
  • READOUT_FROM_SIDECAR — Readout time came from the Capture sidecar.
  • MATCH_OK — The track matches the reference log at one time.
Matchpeak correlation 0.979, next peak 0.794, track length 69 s
+
+ +
+

Key plots

+
Grid frequency deviation measured from the video and the matched reference segment, plotted against time in the video.
Measured grid frequency variation and matched reference.
Normalized correlation between the video track and the reference for every candidate start time in the search window.
Correlation against candidate start times.
Estimated flicker phase jump at each frame boundary. Solid vertical lines mark edit candidates; dotted lines mark frame-timestamp gaps.
Phase jump at frame boundaries. Solid line: edit candidate. Dotted line: timestamp gap.
Fitted flicker band amplitude for each frame.
Flicker band amplitude per frame (fractional modulation).
+
+ +
+

Limitations

+
    +
  • GRIDPRINT reads the grid frequency from the flicker of mains-powered lights. It is not a deepfake classifier and it is not cryptographic proof.
  • +
  • A missing signal is never evidence that a video is fake. Many phones hide the flicker ("anti-banding"), and daylight or battery lights do not flicker.
  • +
  • A time estimate is possible only inside the time range of the reference log for the zone.
  • +
  • Location output is limited to the grid zone. GRIDPRINT gives no finer location.
  • +
  • Thresholds come from calibration data. Results outside the calibrated conditions carry more risk of error.
  • +
  • A CONTRADICTED verdict needs approval by a human reviewer before the report is final.
  • +
+
+ + + + + +
+

Provenance

+ + + + + + +
File SHA-256b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779
Engine version0.1.0
Config hash8f439372b865ee8e
Thresholds hash0161b96f77d3e925
Jobf2f2bda20247
+
+ +
+

Appendix

+

Continuity events

+

None.

+

Quality metrics

+
axisrows+
band_snr_db11.315922281294142
bitrate475816
bits_per_pixel0.2065173611111111
camera_motion_px0.0332642155899567
codech264
dft_peak_hz100.02935230815478
estimators_agreeTrue
foreground_fraction0.052797619047619045
frames2100
height240
jitter_p50_ms3.3302427482340136e-07
jitter_p95_ms3.3385298969790256e-07
motion_level_px0.1115635689380337
nominal_flicker_hz100.0
opencv_frame_count2100
phase_mean_flicker_hz100.02620440768338
readout_s0.025
readout_sourceREADOUT_FROM_SIDECAR
rotation_metadata_deg0
segmentationok
static_fraction1.0
timestamp_sourcesensor
timing_assumptionsensor_timestamp_is_first_row_exposure_start
track_idt1
track_samples66
transferbt709
verdict_ruleS13.4
width320
+

Stage timings (s)

+
S1_ingest0.2925
S2_linear2.1281
S3_readout0.0
S4_motion6.4318
S5_segment0.9351
S7_rowsignal1.1881
S6_patches1.4897
S8_phase0.7569
S10_match0.6921
S11_continuity0.0015
+
+
+ + \ No newline at end of file diff --git a/results/aws/f2f2bda20247/report.pdf b/results/aws/f2f2bda20247/report.pdf new file mode 100644 index 0000000..9675d1b Binary files /dev/null and b/results/aws/f2f2bda20247/report.pdf differ diff --git a/results/aws/f2f2bda20247/result.json b/results/aws/f2f2bda20247/result.json new file mode 100644 index 0000000..e1d1cef --- /dev/null +++ b/results/aws/f2f2bda20247/result.json @@ -0,0 +1,168 @@ +{ + "job_id": "f2f2bda20247", + "file_sha256": "b77ced2d949742114aa1c67988026396ef14c72cfd7221ff30663d595d7c7779", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "time_estimate_utc": 1768903200.0205326, + "time_estimate_iso": "2026-01-20T10:00:00.020533+00:00", + "time_uncertainty_s": 1.5328837314983603, + "zone": "SIM50", + "match": { + "zone": "SIM50", + "window_start_utc": 1768899600.0, + "window_end_utc": 1768906800.0, + "best_offset_utc": 1768903200.0205326, + "rho1": 0.9786120306875769, + "rho2": 0.7944010986559481, + "margin": 0.18421093203162875, + "psr": 3.063529487146239, + "track_length_s": 69.0, + "time_uncertainty_s": 1.5328837314983603, + "passes": true, + "segments": [ + { + "start_s": 2.0, + "end_s": 32.0, + "offset_s": 1768903199.6960204, + "rho1": 0.9773509057903753, + "margin": 0.04668681624361348, + "passes": true + }, + { + "start_s": 32.0, + "end_s": 62.0, + "offset_s": 1768903200.4487772, + "rho1": 0.9819621015376805, + "margin": 0.024282228683248808, + "passes": true + } + ], + "segments_consistent": true + }, + "continuity_events": [], + "face_region": null, + "quality": { + "codec": "h264", + "width": 320, + "height": 240, + "frames": 2100, + "bitrate": 475816, + "bits_per_pixel": 0.2065173611111111, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "sensor", + "jitter_p50_ms": 3.3302427482340136e-07, + "jitter_p95_ms": 3.3385298969790256e-07, + "timing_assumption": "sensor_timestamp_is_first_row_exposure_start", + "opencv_frame_count": 2100, + "gaps": [], + "readout_s": 0.025, + "readout_source": "READOUT_FROM_SIDECAR", + "motion_level_px": 0.1115635689380337, + "camera_motion_px": 0.0332642155899567, + "static_fraction": 1.0, + "segmentation": "ok", + "foreground_fraction": 0.052797619047619045, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": 11.315922281294142, + "estimators_agree": true, + "dft_peak_hz": 100.02935230815478, + "phase_mean_flicker_hz": 100.02620440768338, + "patch_ids": [ + 2, + 3, + 4, + 5, + 6, + 7, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63 + ], + "track_samples": 66, + "verdict_rule": "S13.4", + "pdf_engine": "weasyprint" + }, + "stage_timings_s": { + "S1_ingest": 0.2925, + "S2_linear": 2.1281, + "S3_readout": 0.0, + "S4_motion": 6.4318, + "S5_segment": 0.9351, + "S7_rowsignal": 1.1881, + "S6_patches": 1.4897, + "S8_phase": 0.7569, + "S10_match": 0.6921, + "S11_continuity": 0.0015, + "S14_overlay": 36.8304, + "S15_report": 0.9918 + }, + "artifacts": { + "overlay_mp4": "/app/work/jobs/f2f2bda20247/overlay.mp4", + "report_html": "/app/work/jobs/f2f2bda20247/report.html", + "report_pdf": "/app/work/jobs/f2f2bda20247/report.pdf", + "report_json": "/app/work/jobs/f2f2bda20247/result.json", + "plot_enf_track": "/app/work/jobs/f2f2bda20247/enf_track.png", + "plot_ncc_scan": "/app/work/jobs/f2f2bda20247/ncc_scan.png", + "plot_phase_residual": "/app/work/jobs/f2f2bda20247/phase_residual.png", + "plot_band_amplitude": "/app/work/jobs/f2f2bda20247/band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/aws/f2f2bda20247/trace.json b/results/aws/f2f2bda20247/trace.json new file mode 100644 index 0000000..2c406a9 --- /dev/null +++ b/results/aws/f2f2bda20247/trace.json @@ -0,0 +1,145 @@ +{ + "job_id": "f2f2bda20247", + "steps": [ + { + "index": 0, + "t_start": "2026-10-27T05:19:42.393042+00:00", + "t_end": "2026-10-27T05:19:46.377058+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "probe_video", + "input_summary": "{\"job_id\":\"f2f2bda20247\"}", + "output_summary": "{\"metadata\":{\"codec\":\"h264\",\"width\":320,\"height\":240,\"frames\":2100,\"bitrate\":475816,\"transfer\":\"bt709\",\"rotation_metadata_deg\":0},\"timestamp_source\":\"sensor\",\"jitter_p95_ms\":0.0,\"gaps\":0,\"hdr\":false,\"high_compression\":false,\"sidecar\":true,\"notes\":[],\"axis_info\":\"sidecar: sensor rows = coded rows\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 3.984, + "error": null, + "policy_note": null + }, + { + "index": 1, + "t_start": "2026-10-27T05:19:46.377356+00:00", + "t_end": "2026-10-27T05:19:47.207364+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "estimate_readout", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"method\":\"auto\"}", + "output_summary": "{\"readout_s\":0.025,\"source\":\"READOUT_FROM_SIDECAR\",\"confidence\":1.0,\"low_confidence\":false}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.83, + "error": null, + "policy_note": null + }, + { + "index": 2, + "t_start": "2026-10-27T05:19:47.208559+00:00", + "t_end": "2026-10-27T05:19:56.356722+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "analyze_motion", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"strictness\":\"normal\"}", + "output_summary": "{\"motion_level\":0.1116,\"static_fraction\":1.0,\"high_motion\":false,\"strictness\":\"normal\",\"mask_id\":\"f2f2bda20247:normal\",\"segmentation\":\"ok\",\"low_motion_frames\":null}", + "decision_reason": "bedrock planner choice", + "duration_s": 9.1482, + "error": null, + "policy_note": null + }, + { + "index": 3, + "t_start": "2026-10-27T05:19:56.357048+00:00", + "t_end": "2026-10-27T05:19:58.512623+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"strategy\":\"top\"}", + "output_summary": "{\"strategy\":\"top\",\"selected\":[63,53,61,62,23,15,35,37,36,31,22,29,25,30],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\":18.75},{\"id\":39,\"score_db\":18.67}],\"eligible\":56,\"total\":64}", + "decision_reason": "bedrock planner choice", + "duration_s": 2.1556, + "error": null, + "policy_note": null + }, + { + "index": 4, + "t_start": "2026-10-27T05:19:58.514061+00:00", + "t_end": "2026-10-27T05:19:59.461607+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "propose_patches", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"strategy\":\"all\"}", + "output_summary": "{\"strategy\":\"all\",\"selected\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63],\"ranked\":[{\"id\":63,\"score_db\":20.58},{\"id\":53,\"score_db\":19.85},{\"id\":61,\"score_db\":19.75},{\"id\":62,\"score_db\":19.61},{\"id\":23,\"score_db\":19.5},{\"id\":15,\"score_db\":19.44},{\"id\":35,\"score_db\":19.28},{\"id\":37,\"score_db\":19.26},{\"id\":36,\"score_db\":19.06},{\"id\":31,\"score_db\":18.98},{\"id\":22,\"score_db\":18.88},{\"id\":29,\"score_db\":18.84},{\"id\":25,\"score_db\":18.8},{\"id\":30,\"score_db\":18.78},{\"id\":10,\"score_db\"...", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 60, 'patch_ids': [63, 53, 61, 62, 23, 15, 35, 37, 36, 31, 22, 29, 25, 30], 'axis': 'rows+', 'frame_subset': 'all'} (frequency or axis override before the first extraction); fallback rule: rank light patches", + "duration_s": 0.9475, + "error": null, + "policy_note": null + }, + { + "index": 5, + "t_start": "2026-10-27T05:19:59.461998+00:00", + "t_end": "2026-10-27T05:20:01.275636+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "extract_flicker", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"patch_ids\":[2,3,4,5,6,7,9,10,11,12,13,14,15,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,41,42,43,44,45,46,47,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]}", + "output_summary": "{\"track_id\":\"t1\",\"band_snr_db\":11.316,\"axis\":\"rows+\",\"nominal_flicker_hz\":100.0,\"frames_used\":2100,\"track_samples\":66,\"mean_flicker_hz\":100.0262,\"dft_peak_hz\":100.02935,\"estimators_agree\":true,\"reasons\":[],\"candidates\":{\"rows+@100\":11.34}}", + "decision_reason": "guard: planner proposed extract_flicker {'nominal_hz': 50, 'patch_ids': [63, 53, 61, 62, 23, 15, 35, 37, 36, 31, 22, 29, 25, 30], 'axis': 'rows+', 'frame_subset': ''} (frequency or axis override before the first extraction); fallback rule: first extraction on all eligible patches", + "duration_s": 1.8136, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 6, + "t_start": "2026-10-27T05:20:01.276037+00:00", + "t_end": "2026-10-27T05:20:02.493078+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "match_reference", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"zone\":\"SIM50\",\"passes\":true,\"best_offset_utc\":1768903200.0205326,\"rho1\":0.9786120306875769,\"rho2\":0.7944010986559481,\"margin\":0.18421093203162875,\"psr\":3.063529487146239,\"track_length_s\":69.0,\"time_uncertainty_s\":1.5328837314983603,\"segments_consistent\":true,\"reasons\":[\"MATCH_OK\"]}", + "decision_reason": "bedrock planner choice", + "duration_s": 1.217, + "error": null, + "policy_note": "policy: disallowed arguments removed" + }, + { + "index": 7, + "t_start": "2026-10-27T05:20:02.493503+00:00", + "t_end": "2026-10-27T05:20:03.031843+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "check_continuity", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"track_id\":\"t1\"}", + "output_summary": "{\"track_id\":\"t1\",\"events\":[],\"edit_candidates\":0,\"dropped_explained\":0,\"reasons\":[]}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.5383, + "error": null, + "policy_note": null + }, + { + "index": 8, + "t_start": "2026-10-27T05:20:03.032274+00:00", + "t_end": "2026-10-27T05:20:03.757397+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "compute_verdict", + "input_summary": "{\"job_id\":\"f2f2bda20247\"}", + "output_summary": "{\"verdict\":\"VERIFIED\",\"lifecycle_state\":\"DRAFT\",\"reasons\":[\"READOUT_FROM_SIDECAR\",\"MATCH_OK\"],\"rule\":\"S13.4\"}", + "decision_reason": "bedrock planner choice", + "duration_s": 0.7251, + "error": null, + "policy_note": null + }, + { + "index": 9, + "t_start": "2026-10-27T05:20:03.758936+00:00", + "t_end": "2026-10-27T05:20:42.072157+00:00", + "planner": "bedrock", + "model_id": "us.amazon.nova-lite-v1:0", + "tool": "render_report", + "input_summary": "{\"job_id\":\"f2f2bda20247\",\"final\":true}", + "output_summary": "{\"artifacts\":{\"overlay_mp4\":\"/app/work/jobs/f2f2bda20247/overlay.mp4\",\"report_html\":\"/app/work/jobs/f2f2bda20247/report.html\",\"report_pdf\":\"/app/work/jobs/f2f2bda20247/report.pdf\",\"report_json\":\"/app/work/jobs/f2f2bda20247/result.json\",\"plot_enf_track\":\"/app/work/jobs/f2f2bda20247/enf_track.png\",\"plot_ncc_scan\":\"/app/work/jobs/f2f2bda20247/ncc_scan.png\",\"plot_phase_residual\":\"/app/work/jobs/f2f2bda20247/phase_residual.png\",\"plot_band_amplitude\":\"/app/work/jobs/f2f2bda20247/band_amplitude.png\"},\"lifecycle_state\":\"FINAL\"}", + "decision_reason": "policy: report must be rendered", + "duration_s": 38.3132, + "error": null, + "policy_note": "report required" + } + ] +} \ No newline at end of file diff --git a/results/aws/index.json b/results/aws/index.json new file mode 100644 index 0000000..fc03b8a --- /dev/null +++ b/results/aws/index.json @@ -0,0 +1,318 @@ +[ + { + "job_id": "943b24f46a32", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "USER_INPUT_REQUESTED" + ], + "time_estimate_iso": null, + "band_snr_db": null, + "stage_timings_s": { + "S14_overlay": 0.0, + "S15_report": 0.6007 + } + }, + { + "job_id": "aws3-capture-verified-040158", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "time_estimate_iso": "2026-01-20T10:00:00.020533+00:00", + "band_snr_db": 11.315922281294142, + "stage_timings_s": { + "S1_ingest": 0.2939, + "S2_linear": 2.1477, + "S3_readout": 0.0, + "S4_motion": 6.4114, + "S5_segment": 0.9484, + "S7_rowsignal": 1.3298, + "S6_patches": 2.0457, + "S8_phase": 0.7744, + "S10_match": 0.7004, + "S11_continuity": 0.0009, + "S14_overlay": 37.9244, + "S15_report": 1.0994 + } + }, + { + "job_id": "aws3-cut-1s-040211", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK", + "CLAIM_TIME_MATCH" + ], + "time_estimate_iso": "2026-01-20T10:00:00.469923+00:00", + "band_snr_db": 11.374746290115677, + "stage_timings_s": { + "S1_ingest": 0.2943, + "S2_linear": 2.1275, + "S7_rowsignal": 2.5627, + "S3_readout": 4.4826, + "S4_motion": 6.3767, + "S5_segment": 0.9469, + "S6_patches": 3.2888, + "S8_phase": 2.4554, + "S10_match": 0.2329, + "S11_continuity": 0.001, + "S14_overlay": 36.5538, + "S15_report": 1.1319 + } + }, + { + "job_id": "aws3-dropped-frames-040218", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "DROPPED_FRAMES_EXPLAINED" + ], + "time_estimate_iso": "2026-01-20T10:00:00.014252+00:00", + "band_snr_db": 11.426580954399864, + "stage_timings_s": { + "S1_ingest": 0.2987, + "S2_linear": 2.1473, + "S3_readout": 0.0, + "S4_motion": 6.429, + "S5_segment": 0.9464, + "S7_rowsignal": 1.3119, + "S6_patches": 1.5387, + "S8_phase": 0.7588, + "S10_match": 0.6712, + "S11_continuity": 0.0009, + "S14_overlay": 36.9424, + "S15_report": 1.0727 + } + }, + { + "job_id": "aws4-agent-recovery-041816", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_REFERENCE_COVERAGE" + ], + "time_estimate_iso": null, + "band_snr_db": 7.539332816617346, + "stage_timings_s": { + "S1_ingest": 0.5777, + "S2_linear": 2.4379, + "S7_rowsignal": 2.6242, + "S3_readout": 7.8005, + "S4_motion": 6.744, + "S5_segment": 0.9506, + "S6_patches": 5.5234, + "S8_phase": 4.6962, + "S10_match": 0.1805, + "S14_overlay": 24.2106, + "S15_report": 0.8063 + } + }, + { + "job_id": "aws4-capture-verified-041747", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "time_estimate_iso": "2026-01-20T09:59:59.973488+00:00", + "band_snr_db": 6.614609559814535, + "stage_timings_s": { + "S1_ingest": 0.2958, + "S2_linear": 2.1547, + "S3_readout": 0.0, + "S4_motion": 6.4506, + "S5_segment": 0.9503, + "S7_rowsignal": 1.3239, + "S6_patches": 1.5129, + "S8_phase": 0.7567, + "S10_match": 0.7072, + "S11_continuity": 0.0009, + "S14_overlay": 37.317, + "S15_report": 1.0563 + } + }, + { + "job_id": "aws4-cut-1s-041731", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK", + "CLAIM_TIME_MATCH" + ], + "time_estimate_iso": "2026-01-20T10:00:00.471766+00:00", + "band_snr_db": 11.376864427453565, + "stage_timings_s": { + "S1_ingest": 0.2926, + "S2_linear": 2.1276, + "S7_rowsignal": 2.5711, + "S3_readout": 4.4656, + "S6_patches": 3.1795, + "S4_motion": 6.3441, + "S5_segment": 0.9508, + "S8_phase": 2.4438, + "S10_match": 0.2308, + "S14_overlay": 22.8081, + "S15_report": 0.9082 + } + }, + { + "job_id": "aws4-daylight-only-041808", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "DRAFT", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED", + "HIGH_COMPRESSION", + "USER_INPUT_REQUESTED" + ], + "time_estimate_iso": null, + "band_snr_db": -10.996643949422392, + "stage_timings_s": { + "S1_ingest": 0.0534, + "S2_linear": 0.8365, + "S7_rowsignal": 1.1071, + "S3_readout": 4.6561, + "S4_motion": 1.7013, + "S5_segment": 0.417, + "S6_patches": 2.3712, + "S8_phase": 4.0717 + } + }, + { + "job_id": "aws4-dropped-frames-041757", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK" + ], + "time_estimate_iso": "2026-01-20T10:00:00.109978+00:00", + "band_snr_db": 8.066753447894417, + "stage_timings_s": { + "S1_ingest": 0.3257, + "S2_linear": 2.1445, + "S3_readout": 2.0851, + "S7_rowsignal": 2.6154, + "S4_motion": 6.4908, + "S5_segment": 1.006, + "S6_patches": 1.5211, + "S8_phase": 0.7494, + "S10_match": 0.7262, + "S14_overlay": 24.0282, + "S15_report": 1.1517 + } + }, + { + "job_id": "aws4-insertion-041739", + "verdict": null, + "lifecycle_state": null, + "reasons": null, + "time_estimate_iso": null, + "band_snr_db": null, + "stage_timings_s": null + }, + { + "job_id": "cd65b6ea0c20", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "DRAFT", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED", + "USER_INPUT_REQUESTED" + ], + "time_estimate_iso": null, + "band_snr_db": -7.1410614668336, + "stage_timings_s": { + "S1_ingest": 13.6506, + "S2_linear": 42.7896, + "S7_rowsignal": 1.7472, + "S3_readout": 5.4815, + "S4_motion": 2.2883, + "S5_segment": 0.6041, + "S6_patches": 3.2024, + "S8_phase": 9.3289 + } + }, + { + "job_id": "e5e8643a8662", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "DROPPED_FRAMES_EXPLAINED" + ], + "time_estimate_iso": "2026-01-20T10:00:00.014252+00:00", + "band_snr_db": 11.426580954399864, + "stage_timings_s": { + "S1_ingest": 0.2984, + "S2_linear": 2.1164, + "S3_readout": 0.0, + "S4_motion": 6.3535, + "S5_segment": 0.9316, + "S7_rowsignal": 1.1869, + "S6_patches": 1.482, + "S8_phase": 0.7538, + "S10_match": 0.6674, + "S11_continuity": 0.0009, + "S14_overlay": 35.8875, + "S15_report": 0.985 + } + }, + { + "job_id": "ea0208da7833", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "DRAFT", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH" + ], + "time_estimate_iso": null, + "band_snr_db": 8.051949402243615, + "stage_timings_s": { + "S1_ingest": 0.299, + "S2_linear": 2.0913, + "S7_rowsignal": 2.3051, + "S3_readout": 4.2851, + "S4_motion": 6.4261, + "S5_segment": 0.9533, + "S6_patches": 3.1052, + "S8_phase": 2.3565, + "S10_match": 0.2061 + } + }, + { + "job_id": "f2f2bda20247", + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "time_estimate_iso": "2026-01-20T10:00:00.020533+00:00", + "band_snr_db": 11.315922281294142, + "stage_timings_s": { + "S1_ingest": 0.2925, + "S2_linear": 2.1281, + "S3_readout": 0.0, + "S4_motion": 6.4318, + "S5_segment": 0.9351, + "S7_rowsignal": 1.1881, + "S6_patches": 1.4897, + "S8_phase": 0.7569, + "S10_match": 0.6921, + "S11_continuity": 0.0015, + "S14_overlay": 36.8304, + "S15_report": 0.9918 + } + } +] \ No newline at end of file diff --git a/results/bench/2026-10-27/A/runs.json b/results/bench/2026-10-27/A/runs.json new file mode 100644 index 0000000..716fb26 --- /dev/null +++ b/results/bench/2026-10-27/A/runs.json @@ -0,0 +1,107 @@ +[ + { + "run": 0, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 16.57122512, + "cpu_s": 23.919999999999998, + "video_s": 15.133333333333333, + "cpu_util": 0.18043324970531807, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 0.9665, + "S2_linear": 5.215, + "S7_rowsignal": 0.7521, + "S3_readout": 3.9865, + "S4_motion": 2.3848, + "S5_segment": 0.0001, + "S6_patches": 1.9642, + "S8_phase": 1.6166, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1332.3359375 + }, + { + "run": 1, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 16.519173375999998, + "cpu_s": 23.84, + "video_s": 15.133333333333333, + "cpu_util": 0.1803964358367662, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 0.9575, + "S2_linear": 5.1621, + "S7_rowsignal": 0.748, + "S3_readout": 3.9925, + "S4_motion": 2.3889, + "S5_segment": 0.0001, + "S6_patches": 1.9722, + "S8_phase": 1.614, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1900.109375 + }, + { + "run": 2, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 16.563603305, + "cpu_s": 23.870000000000005, + "video_s": 15.133333333333333, + "cpu_util": 0.18013894350508297, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 0.9622, + "S2_linear": 5.12, + "S7_rowsignal": 0.7526, + "S3_readout": 4.0411, + "S4_motion": 2.3926, + "S5_segment": 0.0001, + "S6_patches": 1.9737, + "S8_phase": 1.6359, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1999.91796875 + }, + { + "run": 3, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 16.487621383999993, + "cpu_s": 23.75, + "video_s": 15.133333333333333, + "cpu_util": 0.18005932637930117, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 0.9575, + "S2_linear": 5.1148, + "S7_rowsignal": 0.7575, + "S3_readout": 4.0526, + "S4_motion": 2.3803, + "S5_segment": 0.0001, + "S6_patches": 1.9457, + "S8_phase": 1.5989, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1999.91796875 + }, + { + "run": 4, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 16.451729332, + "cpu_s": 23.77000000000001, + "video_s": 15.133333333333333, + "cpu_util": 0.1806041140137572, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 0.9612, + "S2_linear": 5.1233, + "S7_rowsignal": 0.7488, + "S3_readout": 4.0016, + "S4_motion": 2.3836, + "S5_segment": 0.0001, + "S6_patches": 1.9473, + "S8_phase": 1.6006, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1999.91796875 + } +] \ No newline at end of file diff --git a/results/bench/2026-10-27/A/summary.json b/results/bench/2026-10-27/A/summary.json new file mode 100644 index 0000000..7cbdab4 --- /dev/null +++ b/results/bench/2026-10-27/A/summary.json @@ -0,0 +1,61 @@ +{ + "throughput_video_s_per_wall_s": { + "mean": 0.916141939312045, + "std": 0.0028058387337305908, + "per_run": [ + 0.9132296027448652, + 0.9161071797527053, + 0.9136498293680508, + 0.917860313557364, + 0.9198627711372399 + ] + }, + "stage_latency_s": { + "S12_face": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S1_ingest": { + "p50": 0.9612, + "p95": 0.96564 + }, + "S2_linear": { + "p50": 5.1233, + "p95": 5.20442 + }, + "S3_readout": { + "p50": 4.0016, + "p95": 4.0503 + }, + "S4_motion": { + "p50": 2.3848, + "p95": 2.39186 + }, + "S5_segment": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S6_patches": { + "p50": 1.9642, + "p95": 1.9734 + }, + "S7_rowsignal": { + "p50": 0.7521, + "p95": 0.75652 + }, + "S8_phase": { + "p50": 1.614, + "p95": 1.63204 + } + }, + "cpu_util_mean": 0.18032641388804513, + "peak_rss_mb_max": 1999.91796875, + "config": "A", + "machine": "x86_64", + "platform": "Linux-6.18.56-125.164.amzn2023.x86_64-x86_64-with-glibc2.34", + "cpu_count": 8, + "opencv_version": "5.0.0", + "date": "2026-10-27T02:20:35.668823+00:00", + "inputs_file": "/opt/gp/bench/inputs.txt", + "runs": 5 +} \ No newline at end of file diff --git a/results/bench/2026-10-27/A/tracks.npz b/results/bench/2026-10-27/A/tracks.npz new file mode 100644 index 0000000..689c268 Binary files /dev/null and b/results/bench/2026-10-27/A/tracks.npz differ diff --git a/results/bench/2026-10-27/B/runs.json b/results/bench/2026-10-27/B/runs.json new file mode 100644 index 0000000..d31f87c --- /dev/null +++ b/results/bench/2026-10-27/B/runs.json @@ -0,0 +1,107 @@ +[ + { + "run": 0, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 12.627013114, + "cpu_s": 17.64, + "video_s": 15.133333333333333, + "cpu_util": 0.17462562049256458, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 1.0459, + "S2_linear": 4.2561, + "S7_rowsignal": 0.4107, + "S3_readout": 3.3223, + "S4_motion": 1.6433, + "S5_segment": 0.0001, + "S6_patches": 1.1428, + "S8_phase": 0.982, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1323.828125 + }, + { + "run": 1, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 12.625886331000004, + "cpu_s": 17.61, + "video_s": 15.133333333333333, + "cpu_util": 0.17434419590768288, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 1.0378, + "S2_linear": 4.2541, + "S7_rowsignal": 0.4091, + "S3_readout": 3.3444, + "S4_motion": 1.6458, + "S5_segment": 0.0001, + "S6_patches": 1.14, + "S8_phase": 0.9757, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1891.2265625 + }, + { + "run": 2, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 12.580865345000007, + "cpu_s": 17.53, + "video_s": 15.133333333333333, + "cpu_util": 0.17417323370930643, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 1.0387, + "S2_linear": 4.2415, + "S7_rowsignal": 0.4076, + "S3_readout": 3.3237, + "S4_motion": 1.6448, + "S5_segment": 0.0001, + "S6_patches": 1.1322, + "S8_phase": 0.974, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1924.53515625 + }, + { + "run": 3, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 12.581943960000004, + "cpu_s": 17.550000000000004, + "video_s": 15.133333333333333, + "cpu_util": 0.17435699975888302, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 1.038, + "S2_linear": 4.2154, + "S7_rowsignal": 0.411, + "S3_readout": 3.3276, + "S4_motion": 1.6496, + "S5_segment": 0.0001, + "S6_patches": 1.1441, + "S8_phase": 0.9777, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1957.79296875 + }, + { + "run": 4, + "input": "data/public/fluorescent_beat_effect.mp4", + "wall_s": 12.584985610999993, + "cpu_s": 17.570000000000007, + "video_s": 15.133333333333333, + "cpu_util": 0.17451350902462323, + "verdict": "INCONCLUSIVE", + "stage_timings_s": { + "S1_ingest": 1.038, + "S2_linear": 4.2149, + "S7_rowsignal": 0.4103, + "S3_readout": 3.3185, + "S4_motion": 1.6521, + "S5_segment": 0.0001, + "S6_patches": 1.1474, + "S8_phase": 0.9855, + "S12_face": 0.0001 + }, + "peak_rss_mb": 1957.79296875 + } +] \ No newline at end of file diff --git a/results/bench/2026-10-27/B/summary.json b/results/bench/2026-10-27/B/summary.json new file mode 100644 index 0000000..6d1d2b6 --- /dev/null +++ b/results/bench/2026-10-27/B/summary.json @@ -0,0 +1,61 @@ +{ + "throughput_video_s_per_wall_s": { + "mean": 1.201048467324347, + "std": 0.0022927245185856136, + "per_run": [ + 1.198488763471267, + 1.198595721250623, + 1.2028849302760998, + 1.2027818103024939, + 1.2024911113212509 + ] + }, + "stage_latency_s": { + "S12_face": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S1_ingest": { + "p50": 1.038, + "p95": 1.04446 + }, + "S2_linear": { + "p50": 4.2415, + "p95": 4.2557 + }, + "S3_readout": { + "p50": 3.3237, + "p95": 3.34104 + }, + "S4_motion": { + "p50": 1.6458, + "p95": 1.6516 + }, + "S5_segment": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S6_patches": { + "p50": 1.1428, + "p95": 1.1467399999999999 + }, + "S7_rowsignal": { + "p50": 0.4103, + "p95": 0.41093999999999997 + }, + "S8_phase": { + "p50": 0.9777, + "p95": 0.9848 + } + }, + "cpu_util_mean": 0.17440271177861205, + "peak_rss_mb_max": 1957.79296875, + "config": "B", + "machine": "aarch64", + "platform": "Linux-6.18.56-125.164.amzn2023.aarch64-aarch64-with-glibc2.34", + "cpu_count": 8, + "opencv_version": "5.0.0", + "date": "2026-10-27T02:20:17.891199+00:00", + "inputs_file": "/opt/gp/bench/inputs.txt", + "runs": 5 +} \ No newline at end of file diff --git a/results/bench/2026-10-27/B/tracks.npz b/results/bench/2026-10-27/B/tracks.npz new file mode 100644 index 0000000..6f28630 Binary files /dev/null and b/results/bench/2026-10-27/B/tracks.npz differ diff --git a/results/bench/2026-10-27/cost.json b/results/bench/2026-10-27/cost.json new file mode 100644 index 0000000..fdac76d --- /dev/null +++ b/results/bench/2026-10-27/cost.json @@ -0,0 +1,19 @@ +{ + "formula": "cost_per_video_hour_usd = hourly_price_usd / throughput_video_s_per_wall_s", + "configs": { + "A": { + "instance_type": "c7i.2xlarge", + "ec2_usd_per_hour": 0.357, + "software_fee_usd_per_hour": null, + "throughput": 0.916141939312045, + "cost_per_video_hour_usd": 0.3896776085462048 + }, + "B": { + "instance_type": "c8g.2xlarge", + "ec2_usd_per_hour": 0.31904, + "software_fee_usd_per_hour": null, + "throughput": 1.201048467324347, + "cost_per_video_hour_usd": 0.2656345756893108 + } + } +} \ No newline at end of file diff --git a/results/bench/2026-10-27/evidence/A/build_information.txt b/results/bench/2026-10-27/evidence/A/build_information.txt new file mode 100644 index 0000000..b3e592f --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/build_information.txt @@ -0,0 +1,124 @@ + +General configuration for OpenCV 5.0.0 ===================================== + Version control: 5.0.0 + + Platform: + Timestamp: 2026-07-01T09:06:11Z + Host: Linux 6.8.0-1059-azure x86_64 + CMake: 4.3.2 + CMake generator: Unix Makefiles + CMake build tool: /bin/gmake + Configuration: Release + Algorithm Hint: ALGO_HINT_ACCURATE + + CPU/HW features: + Baseline: SSE SSE2 SSE3 + requested: SSE3 + Dispatched code generation: SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX + SSE4_1 (18 files): + SSSE3 SSE4_1 + SSE4_2 (1 files): + SSSE3 SSE4_1 POPCNT SSE4_2 + AVX (17 files): + SSSE3 SSE4_1 POPCNT SSE4_2 AVX + FP16 (0 files): + SSSE3 SSE4_1 POPCNT SSE4_2 AVX FP16 + AVX2 (49 files): + SSSE3 SSE4_1 POPCNT SSE4_2 AVX FP16 AVX2 FMA3 + AVX512_SKX (9 files): + SSSE3 SSE4_1 POPCNT SSE4_2 AVX FP16 AVX2 FMA3 AVX_512F AVX512_COMMON AVX512_SKX + + C/C++: + Built as dynamic libs?: NO + C++ standard: 17 + C++ Compiler: /opt/rh/gcc-toolset-14/root/usr/bin/c++ (ver 14.2.1) + C++ flags (Release): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG + C++ flags (Debug): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse3 -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG + C Compiler: /opt/rh/gcc-toolset-14/root/usr/bin/cc + C flags (Release): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse3 -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG + C flags (Debug): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -msse3 -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG + Linker flags (Release): -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a -L/ffmpeg_build/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined + Linker flags (Debug): -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a -L/ffmpeg_build/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined + ccache: YES + Precompiled headers: NO + Extra dependencies: avif /usr/local/lib/libpng.so /usr/lib64/libz.so /usr/lib64/libopenblasp.so dl m pthread rt + 3rdparty dependencies: ittnotify libprotobuf libjpeg-turbo libwebp libtiff libopenjp2 ipphal ippiw ippicv + + OpenCV modules: + To be built: calib core dnn features flann geometry highgui imgcodecs imgproc objdetect photo ptcloud python3 stereo stitching video videoio + Disabled: world + Disabled by dependency: - + Unavailable: java ts + Applications: - + Documentation: NO + Non-free algorithms: NO + + GUI: NONE + VTK support: NO + Built-in Unicode font: YES + + Media I/O: + ZLib: /usr/lib64/libz.so (ver 1.2.11) + JPEG: build-libjpeg-turbo (ver 3.1.2-70) + SIMD Support Request: YES + SIMD Support: YES + WEBP: build (ver decoder: 0x0210, encoder: 0x0210, demux: 0x0107) + AVIF: avif (ver 1.4.2) + PNG: /usr/local/lib/libpng.so (ver 1.6.58) + Metadata Support: EXIF XMP ICC cICP + TIFF: build (ver 42 - 4.7.1) + JPEG 2000: build (ver 2.5.3) + OpenEXR: NO + GIF: YES + HDR: YES + SUNRASTER: YES + PXM: YES + PFM: YES + + Video I/O: + FFMPEG: YES + avcodec: YES (62.28.101) + avformat: YES (62.12.101) + avutil: YES (60.26.101) + swscale: YES (9.5.101) + GStreamer: NO + v4l/v4l2: YES (linux/videodev2.h) + Orbbec: NO + + Parallel framework: pthreads + + Trace: YES (with Intel ITT(3.25.4)) + + Other third-party libraries: + Intel IPP: 2026.0.0 [2026.0.0] + at: /io/_skbuild/linux-x86_64-3.9/cmake-build/3rdparty/ippicv/ippicv_lnx/icv + Intel IPP IW: sources (2026.0.0) + at: /io/_skbuild/linux-x86_64-3.9/cmake-build/3rdparty/ippicv/ippicv_lnx/iw + VA: NO + Lapack: YES (OpenBLAS /usr/lib64/libopenblasp.so) + DNN MLAS: YES (SGEMM-only, vendored) + ASM kernels: YES (X86_64: SSE2, AVX, FMA3, AVX512F) + Eigen: NO + Custom HAL: YES (ipp (ver 0.0.1)) + Protobuf: build (3.19.1) + Flatbuffers: builtin/3rdparty (25.9.23) + + OpenCL: YES (no extra features) + Include path: /io/opencv/3rdparty/include/opencl/1.2 + Link libraries: Dynamic load + + ONNX Runtime: NO + + Python 3: + Interpreter: /opt/python/cp39-cp39/bin/python3.9 (ver 3.9.25) + Libraries: libpython3.9m.a (ver 3.9.25) + Limited API: YES (ver 0x03060000) + numpy: /home/ci/.local/lib/python3.9/site-packages/numpy/_core/include (ver 2.0.2) + install path: python/cv2/python-3 + + Python (for build): /opt/python/cp39-cp39/bin/python3.9 + + Java: + ant: NO + Java: NO + JNI: NO + Java wrappers: NO + Java tests: NO + + Install to: /io/_skbuild/linux-x86_64-3.9/cmake-install +----------------------------------------------------------------- + diff --git a/results/bench/2026-10-27/evidence/A/instance_identity.json b/results/bench/2026-10-27/evidence/A/instance_identity.json new file mode 100644 index 0000000..a5019b8 --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/instance_identity.json @@ -0,0 +1,17 @@ +{ + "accountId" : "768669378827", + "architecture" : "x86_64", + "availabilityZone" : "us-east-1a", + "billingProducts" : null, + "devpayProductCodes" : null, + "marketplaceProductCodes" : null, + "imageId" : "ami-04b938437b69a2c9c", + "instanceId" : "i-0efebd920cead62df", + "instanceType" : "c7i.2xlarge", + "kernelId" : null, + "pendingTime" : "2026-10-27T02:18:29Z", + "privateIp" : "172.31.15.41", + "ramdiskId" : null, + "region" : "us-east-1", + "version" : "2017-09-30" +} \ No newline at end of file diff --git a/results/bench/2026-10-27/evidence/A/loaded_libraries.txt b/results/bench/2026-10-27/evidence/A/loaded_libraries.txt new file mode 100644 index 0000000..3b25590 --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/loaded_libraries.txt @@ -0,0 +1,49 @@ +/usr/lib64/ld-linux-x86-64.so.2 +/usr/lib64/libbz2.so.1.0.8 +/usr/lib64/libc.so.6 +/usr/lib64/libdl.so.2 +/usr/lib64/libffi.so.8.1.2 +/usr/lib64/libgcc_s-14-20250110.so.1 +/usr/lib64/liblzma.so.5.2.5 +/usr/lib64/libm.so.6 +/usr/lib64/libnss_sss.so.2 +/usr/lib64/libpthread.so.0 +/usr/lib64/libpython3.11.so.1.0 +/usr/lib64/libstdc++.so.6.0.33 +/usr/lib64/libz.so.1.2.11 +/usr/lib64/python3.11/lib-dynload/_bz2.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_contextvars.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_ctypes.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_datetime.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_json.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_lzma.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_opcode.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_pickle.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_posixsubprocess.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_struct.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_typing.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/fcntl.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/select.cpython-311-x86_64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/zlib.cpython-311-x86_64-linux-gnu.so +/usr/local/lib64/python3.11/site-packages/cv2/cv2.abi3.so +/usr/local/lib64/python3.11/site-packages/numpy.libs/libgfortran-040039e1-0352e75f.so.5.0.0 +/usr/local/lib64/python3.11/site-packages/numpy.libs/libquadmath-96973f99-934c22de.so.0.0.0 +/usr/local/lib64/python3.11/site-packages/numpy.libs/libscipy_openblas64_-32a4b2a6.so +/usr/local/lib64/python3.11/site-packages/numpy/_core/_multiarray_umath.cpython-311-x86_64-linux-gnu.so +/usr/local/lib64/python3.11/site-packages/numpy/linalg/_umath_linalg.cpython-311-x86_64-linux-gnu.so +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libaom-a0d22147.so.3.14.1 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavcodec-c4204469.so.62.28.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavformat-4762a711.so.62.12.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavif-43e630fc.so.16.4.2 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavutil-befbbc48.so.60.26.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libcrypto-5409cd36.so.1.1.1k +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libdrm-b0291a67.so.2.4.0 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libgfortran-83c28eba.so.5.0.0 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libopenblasp-r0-59ffcd50.3.15.so +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libpng16-529cb57a.so.16.58.0 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libquadmath-2284e583.so.0.0.0 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libssl-81259c47.so.1.1.1k +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libswresample-2dfded3b.so.6.3.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libswscale-fe215b0b.so.9.5.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libvpx-4fb239ff.so.11.0.1 diff --git a/results/bench/2026-10-27/evidence/A/lscpu.txt b/results/bench/2026-10-27/evidence/A/lscpu.txt new file mode 100644 index 0000000..fe97452 --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/lscpu.txt @@ -0,0 +1,45 @@ +Architecture: x86_64 +CPU op-mode(s): 32-bit, 64-bit +Address sizes: 46 bits physical, 48 bits virtual +Byte Order: Little Endian +CPU(s): 8 +On-line CPU(s) list: 0-7 +Vendor ID: GenuineIntel +BIOS Vendor ID: Intel(R) Corporation +Model name: Intel(R) Xeon(R) Platinum 8488C +BIOS Model name: Intel(R) Xeon(R) Platinum 8488C +CPU family: 6 +Model: 143 +Thread(s) per core: 2 +Core(s) per socket: 4 +Socket(s): 1 +Stepping: 8 +BogoMIPS: 4800.00 +Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq monitor ssse3 fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves avx_vnni avx512_bf16 wbnoinvd ida arat avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid cldemote movdiri movdir64b md_clear serialize amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities +Hypervisor vendor: KVM +Virtualization type: full +L1d cache: 192 KiB (4 instances) +L1i cache: 128 KiB (4 instances) +L2 cache: 8 MiB (4 instances) +L3 cache: 105 MiB (1 instance) +NUMA node(s): 1 +NUMA node0 CPU(s): 0-7 +Vulnerability Gather data sampling: Not affected +Vulnerability Ghostwrite: Not affected +Vulnerability Indirect target selection: Not affected +Vulnerability Itlb multihit: Not affected +Vulnerability L1tf: Not affected +Vulnerability Mds: Not affected +Vulnerability Meltdown: Not affected +Vulnerability Mmio stale data: Not affected +Vulnerability Old microcode: Not affected +Vulnerability Reg file data sampling: Not affected +Vulnerability Retbleed: Not affected +Vulnerability Spec rstack overflow: Not affected +Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl +Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization +Vulnerability Spectre v2: Mitigation; Enhanced / Automatic IBRS; IBPB conditional; PBRSB-eIBRS SW sequence; BHI BHI_DIS_S +Vulnerability Srbds: Not affected +Vulnerability Tsa: Not affected +Vulnerability Tsx async abort: Not affected +Vulnerability Vmscape: Not affected diff --git a/results/bench/2026-10-27/evidence/A/manifest.json b/results/bench/2026-10-27/evidence/A/manifest.json new file mode 100644 index 0000000..2999a4d --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/manifest.json @@ -0,0 +1,27 @@ +{ + "collected_utc": "2026-10-27T02:19:12+00:00", + "files": { + "build_information.txt": { + "marker_hits": { + "kleidicv": 0, + "kleidi": 0, + "cool": 0, + "opencv": 3 + } + }, + "versions.json": {}, + "loaded_libraries.txt": { + "count": 49, + "marker_hits": { + "kleidicv": 0, + "kleidi": 0, + "cool": 0, + "opencv": 15 + } + } + }, + "perf": { + "status": "skipped", + "reason": "no --cmd given" + } +} \ No newline at end of file diff --git a/results/bench/2026-10-27/evidence/A/os_release.txt b/results/bench/2026-10-27/evidence/A/os_release.txt new file mode 100644 index 0000000..52925d5 --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/os_release.txt @@ -0,0 +1,16 @@ +NAME="Amazon Linux" +VERSION="2023" +ID="amzn" +ID_LIKE="fedora" +VERSION_ID="2023" +PLATFORM_ID="platform:al2023" +PRETTY_NAME="Amazon Linux 2023.12.20261026" +ANSI_COLOR="0;33" +CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023" +HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/" +DOCUMENTATION_URL="https://docs.aws.amazon.com/linux/" +SUPPORT_URL="https://aws.amazon.com/premiumsupport/" +BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023" +VENDOR_NAME="AWS" +VENDOR_URL="https://aws.amazon.com/" +SUPPORT_END="2029-06-30" diff --git a/results/bench/2026-10-27/evidence/A/pip_freeze.txt b/results/bench/2026-10-27/evidence/A/pip_freeze.txt new file mode 100644 index 0000000..955b2da --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/pip_freeze.txt @@ -0,0 +1,22 @@ +annotated-types==0.8.0 +av==18.1.0 +contourpy==1.3.3 +cycler==0.12.1 +fonttools==4.67.0 +Jinja2==3.1.6 +kiwisolver==1.5.1 +MarkupSafe==3.0.4 +matplotlib==3.11.2 +numpy==2.4.6 +opencv-python-headless==5.0.0.93 +packaging==26.3 +pillow==13.0.0 +pydantic==2.14.1 +pydantic_core==2.50.1 +pyparsing==3.3.3 +python-dateutil==3.0.0 +PyYAML==6.0.3 +six==1.17.0 +typing-inspection==0.4.4 +typing_extensions==4.16.0 +tzdata==2026.5 diff --git a/results/bench/2026-10-27/evidence/A/versions.json b/results/bench/2026-10-27/evidence/A/versions.json new file mode 100644 index 0000000..8305ca9 --- /dev/null +++ b/results/bench/2026-10-27/evidence/A/versions.json @@ -0,0 +1,8 @@ +{ + "cv2_version": "5.0.0", + "cv2_file": "/usr/local/lib64/python3.11/site-packages/cv2/__init__.py", + "python": "3.11.17 (main, Oct 9 2026, 00:00:00) [GCC 11.5.0 20240719 (Red Hat 11.5.0-5)]", + "platform": "Linux-6.18.56-125.164.amzn2023.x86_64-x86_64-with-glibc2.34", + "machine": "x86_64", + "numpy": "2.4.6" +} \ No newline at end of file diff --git a/results/bench/2026-10-27/evidence/B/build_information.txt b/results/bench/2026-10-27/evidence/B/build_information.txt new file mode 100644 index 0000000..abc65c1 --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/build_information.txt @@ -0,0 +1,117 @@ + +General configuration for OpenCV 5.0.0 ===================================== + Version control: 5.0.0 + + Platform: + Timestamp: 2026-07-01T14:31:05Z + Host: Linux 6.8.0-51-generic aarch64 + CMake: 4.3.2 + CMake generator: Unix Makefiles + CMake build tool: /bin/gmake + Configuration: Release + Algorithm Hint: ALGO_HINT_ACCURATE + + CPU/HW features: + Baseline: NEON FP16 + requested: DETECT + Dispatched code generation: NEON_DOTPROD NEON_FP16 NEON_BF16 + requested: NEON_FP16 NEON_BF16 NEON_DOTPROD + NEON_DOTPROD (3 files): + NEON_DOTPROD + NEON_FP16 (6 files): + NEON_FP16 + NEON_BF16 (0 files): + NEON_BF16 + + C/C++: + Built as dynamic libs?: NO + C++ standard: 17 + C++ Compiler: /opt/rh/gcc-toolset-14/root/usr/bin/c++ (ver 14.2.1) + C++ flags (Release): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -DNDEBUG + C++ flags (Debug): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Wnon-virtual-dtor -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wuninitialized -Wsuggest-override -Wno-delete-non-virtual-dtor -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden -g -O0 -DDEBUG -D_DEBUG + C Compiler: /opt/rh/gcc-toolset-14/root/usr/bin/cc + C flags (Release): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -O3 -DNDEBUG -DNDEBUG + C flags (Debug): -Wl,-strip-all -fsigned-char -W -Wall -Wreturn-type -Waddress -Wsequence-point -Wformat -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wuninitialized -Wno-comment -Wimplicit-fallthrough=3 -Wno-strict-overflow -fdiagnostics-show-option -pthread -fomit-frame-pointer -ffunction-sections -fdata-sections -fvisibility=hidden -g -O0 -DDEBUG -D_DEBUG + Linker flags (Release): -L/ffmpeg_build/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined + Linker flags (Debug): -L/ffmpeg_build/lib -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined + ccache: YES + Precompiled headers: NO + Extra dependencies: avif /usr/local/lib/libpng.so /usr/lib64/libz.so /usr/lib64/libopenblasp.so dl m pthread rt + 3rdparty dependencies: ittnotify libprotobuf libjpeg-turbo libwebp libtiff libopenjp2 tegra_hal kleidicv_hal kleidicv kleidicv_thread + + OpenCV modules: + To be built: calib core dnn features flann geometry highgui imgcodecs imgproc objdetect photo ptcloud python3 stereo stitching video videoio + Disabled: world + Disabled by dependency: - + Unavailable: java ts + Applications: - + Documentation: NO + Non-free algorithms: NO + + GUI: NONE + VTK support: NO + Built-in Unicode font: YES + + Media I/O: + ZLib: /usr/lib64/libz.so (ver 1.2.11) + JPEG: build-libjpeg-turbo (ver 3.1.2-70) + SIMD Support Request: YES + SIMD Support: YES + WEBP: build (ver decoder: 0x0210, encoder: 0x0210, demux: 0x0107) + AVIF: avif (ver 1.4.2) + PNG: /usr/local/lib/libpng.so (ver 1.6.58) + Metadata Support: EXIF XMP ICC cICP + TIFF: build (ver 42 - 4.7.1) + JPEG 2000: build (ver 2.5.3) + OpenEXR: NO + GIF: YES + HDR: YES + SUNRASTER: YES + PXM: YES + PFM: YES + + Video I/O: + FFMPEG: YES + avcodec: YES (62.28.101) + avformat: YES (62.12.101) + avutil: YES (60.26.101) + swscale: YES (9.5.101) + GStreamer: NO + v4l/v4l2: YES (linux/videodev2.h) + Orbbec: NO + + Parallel framework: pthreads + + Trace: YES (with Intel ITT(3.25.4)) + + Other third-party libraries: + Lapack: YES (OpenBLAS /usr/lib64/libopenblasp.so) + DNN MLAS: YES (SGEMM-only, vendored) + ASM kernels: YES (ARM64: NEON SGEMM, NEON SGEMV) + Eigen: NO + Custom HAL: YES (carotene (ver 0.0.1) KleidiCV (ver 26.03)) + Protobuf: build (3.19.1) + Flatbuffers: builtin/3rdparty (25.9.23) + + OpenCL: YES (no extra features) + Include path: /io/opencv/3rdparty/include/opencl/1.2 + Link libraries: Dynamic load + + ONNX Runtime: NO + + Python 3: + Interpreter: /opt/python/cp39-cp39/bin/python3.9 (ver 3.9.25) + Libraries: libpython3.9m.a (ver 3.9.25) + Limited API: YES (ver 0x03060000) + numpy: /home/ci/.local/lib/python3.9/site-packages/numpy/_core/include (ver 2.0.2) + install path: python/cv2/python-3 + + Python (for build): /opt/python/cp39-cp39/bin/python3.9 + + Java: + ant: NO + Java: NO + JNI: NO + Java wrappers: NO + Java tests: NO + + Install to: /io/_skbuild/linux-aarch64-3.9/cmake-install +----------------------------------------------------------------- + diff --git a/results/bench/2026-10-27/evidence/B/instance_identity.json b/results/bench/2026-10-27/evidence/B/instance_identity.json new file mode 100644 index 0000000..ec0b6f0 --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/instance_identity.json @@ -0,0 +1,17 @@ +{ + "accountId" : "768669378827", + "architecture" : "arm64", + "availabilityZone" : "us-east-1a", + "billingProducts" : null, + "devpayProductCodes" : null, + "marketplaceProductCodes" : null, + "imageId" : "ami-00148f0945cd46c39", + "instanceId" : "i-06cc24093306cf5ce", + "instanceType" : "c8g.2xlarge", + "kernelId" : null, + "pendingTime" : "2026-10-27T02:18:30Z", + "privateIp" : "172.31.8.76", + "ramdiskId" : null, + "region" : "us-east-1", + "version" : "2017-09-30" +} \ No newline at end of file diff --git a/results/bench/2026-10-27/evidence/B/loaded_libraries.txt b/results/bench/2026-10-27/evidence/B/loaded_libraries.txt new file mode 100644 index 0000000..15cccbb --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/loaded_libraries.txt @@ -0,0 +1,47 @@ +/usr/lib/ld-linux-aarch64.so.1 +/usr/lib64/libbz2.so.1.0.8 +/usr/lib64/libc.so.6 +/usr/lib64/libdl.so.2 +/usr/lib64/libffi.so.8.1.2 +/usr/lib64/libgcc_s-14-20250110.so.1 +/usr/lib64/liblzma.so.5.2.5 +/usr/lib64/libm.so.6 +/usr/lib64/libnss_sss.so.2 +/usr/lib64/libpthread.so.0 +/usr/lib64/libpython3.11.so.1.0 +/usr/lib64/libstdc++.so.6.0.33 +/usr/lib64/libz.so.1.2.11 +/usr/lib64/python3.11/lib-dynload/_bz2.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_contextvars.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_ctypes.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_datetime.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_json.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_lzma.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_opcode.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_pickle.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_posixsubprocess.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_struct.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/_typing.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/fcntl.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/math.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/select.cpython-311-aarch64-linux-gnu.so +/usr/lib64/python3.11/lib-dynload/zlib.cpython-311-aarch64-linux-gnu.so +/usr/local/lib64/python3.11/site-packages/cv2/cv2.abi3.so +/usr/local/lib64/python3.11/site-packages/numpy.libs/libgfortran-daac5196-038a5e3c.so.5.0.0 +/usr/local/lib64/python3.11/site-packages/numpy.libs/libscipy_openblas64_-7220728c.so +/usr/local/lib64/python3.11/site-packages/numpy/_core/_multiarray_umath.cpython-311-aarch64-linux-gnu.so +/usr/local/lib64/python3.11/site-packages/numpy/linalg/_umath_linalg.cpython-311-aarch64-linux-gnu.so +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libaom-f737b1d9.so.3.14.1 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavcodec-72930352.so.62.28.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavformat-3d8eec66.so.62.12.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavif-96469e55.so.16.4.2 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libavutil-8f5e7298.so.60.26.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libcrypto-6aa7cfbd.so.1.1.1k +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libdrm-7ea97f77.so.2.4.0 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libgfortran-e1b7dfc8.so.5.0.0 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libopenblasp-r0-e3ea6fd1.3.15.so +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libpng16-5dd41f4d.so.16.58.0 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libssl-f4f30056.so.1.1.1k +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libswresample-4e764699.so.6.3.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libswscale-9061c2fd.so.9.5.101 +/usr/local/lib64/python3.11/site-packages/opencv_python_headless.libs/libvpx-ac54ea65.so.11.0.1 diff --git a/results/bench/2026-10-27/evidence/B/lscpu.txt b/results/bench/2026-10-27/evidence/B/lscpu.txt new file mode 100644 index 0000000..21dce5f --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/lscpu.txt @@ -0,0 +1,40 @@ +Architecture: aarch64 +CPU op-mode(s): 64-bit +Byte Order: Little Endian +CPU(s): 8 +On-line CPU(s) list: 0-7 +Vendor ID: ARM +BIOS Vendor ID: AWS +BIOS Model name: AWS Graviton4 +Model: 1 +Thread(s) per core: 1 +Core(s) per socket: 8 +Socket(s): 1 +Stepping: r0p1 +BogoMIPS: 2000.00 +Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti +L1d cache: 512 KiB (8 instances) +L1i cache: 512 KiB (8 instances) +L2 cache: 16 MiB (8 instances) +L3 cache: 36 MiB (1 instance) +NUMA node(s): 1 +NUMA node0 CPU(s): 0-7 +Vulnerability Gather data sampling: Not affected +Vulnerability Ghostwrite: Not affected +Vulnerability Indirect target selection: Not affected +Vulnerability Itlb multihit: Not affected +Vulnerability L1tf: Not affected +Vulnerability Mds: Not affected +Vulnerability Meltdown: Not affected +Vulnerability Mmio stale data: Not affected +Vulnerability Old microcode: Not affected +Vulnerability Reg file data sampling: Not affected +Vulnerability Retbleed: Not affected +Vulnerability Spec rstack overflow: Not affected +Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl +Vulnerability Spectre v1: Mitigation; __user pointer sanitization +Vulnerability Spectre v2: Mitigation; CSV2, BHB +Vulnerability Srbds: Not affected +Vulnerability Tsa: Not affected +Vulnerability Tsx async abort: Not affected +Vulnerability Vmscape: Not affected diff --git a/results/bench/2026-10-27/evidence/B/manifest.json b/results/bench/2026-10-27/evidence/B/manifest.json new file mode 100644 index 0000000..4258d75 --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/manifest.json @@ -0,0 +1,27 @@ +{ + "collected_utc": "2026-10-27T02:19:14+00:00", + "files": { + "build_information.txt": { + "marker_hits": { + "kleidicv": 4, + "kleidi": 4, + "cool": 0, + "opencv": 3 + } + }, + "versions.json": {}, + "loaded_libraries.txt": { + "count": 47, + "marker_hits": { + "kleidicv": 0, + "kleidi": 0, + "cool": 0, + "opencv": 14 + } + } + }, + "perf": { + "status": "skipped", + "reason": "no --cmd given" + } +} \ No newline at end of file diff --git a/results/bench/2026-10-27/evidence/B/os_release.txt b/results/bench/2026-10-27/evidence/B/os_release.txt new file mode 100644 index 0000000..52925d5 --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/os_release.txt @@ -0,0 +1,16 @@ +NAME="Amazon Linux" +VERSION="2023" +ID="amzn" +ID_LIKE="fedora" +VERSION_ID="2023" +PLATFORM_ID="platform:al2023" +PRETTY_NAME="Amazon Linux 2023.12.20261026" +ANSI_COLOR="0;33" +CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023" +HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/" +DOCUMENTATION_URL="https://docs.aws.amazon.com/linux/" +SUPPORT_URL="https://aws.amazon.com/premiumsupport/" +BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023" +VENDOR_NAME="AWS" +VENDOR_URL="https://aws.amazon.com/" +SUPPORT_END="2029-06-30" diff --git a/results/bench/2026-10-27/evidence/B/pip_freeze.txt b/results/bench/2026-10-27/evidence/B/pip_freeze.txt new file mode 100644 index 0000000..955b2da --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/pip_freeze.txt @@ -0,0 +1,22 @@ +annotated-types==0.8.0 +av==18.1.0 +contourpy==1.3.3 +cycler==0.12.1 +fonttools==4.67.0 +Jinja2==3.1.6 +kiwisolver==1.5.1 +MarkupSafe==3.0.4 +matplotlib==3.11.2 +numpy==2.4.6 +opencv-python-headless==5.0.0.93 +packaging==26.3 +pillow==13.0.0 +pydantic==2.14.1 +pydantic_core==2.50.1 +pyparsing==3.3.3 +python-dateutil==3.0.0 +PyYAML==6.0.3 +six==1.17.0 +typing-inspection==0.4.4 +typing_extensions==4.16.0 +tzdata==2026.5 diff --git a/results/bench/2026-10-27/evidence/B/versions.json b/results/bench/2026-10-27/evidence/B/versions.json new file mode 100644 index 0000000..400a96b --- /dev/null +++ b/results/bench/2026-10-27/evidence/B/versions.json @@ -0,0 +1,8 @@ +{ + "cv2_version": "5.0.0", + "cv2_file": "/usr/local/lib64/python3.11/site-packages/cv2/__init__.py", + "python": "3.11.17 (main, Oct 9 2026, 00:00:00) [GCC 11.5.0 20240719 (Red Hat 11.5.0-5)]", + "platform": "Linux-6.18.56-125.164.amzn2023.aarch64-aarch64-with-glibc2.34", + "machine": "aarch64", + "numpy": "2.4.6" +} \ No newline at end of file diff --git a/results/bench/2026-10-27/logs/A.bench.log b/results/bench/2026-10-27/logs/A.bench.log new file mode 100644 index 0000000..c8bd079 --- /dev/null +++ b/results/bench/2026-10-27/logs/A.bench.log @@ -0,0 +1,255 @@ +Shutdown scheduled for Tue 2026-10-27 03:33:37 UTC, use 'shutdown -c' to cancel. ++ date -u +%FT%TZ +2026-10-27T02:18:37Z ++ uname -a +Linux ip-172-31-15-41.ec2.internal 6.18.56-125.164.amzn2023.x86_64 #2 SMP PREEMPT_DYNAMIC Mon Oct 19 19:39:29 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux ++ dnf install -y python3.11 python3.11-pip unzip +Amazon Linux 2023 repository 88 MB/s | 86 MB 00:00 +Amazon Linux 2023 Kernel Livepatch repository 704 kB/s | 89 kB 00:00 +Package unzip-6.0-68.amzn2023.0.2.x86_64 is already installed. +Dependencies resolved. +================================================================================ + Package Arch Version Repository Size +================================================================================ +Installing: + python3.11 x86_64 3.11.17-1.amzn2023.0.1 amazonlinux 28 k + python3.11-pip noarch 22.3.1-2.amzn2023.0.15 amazonlinux 2.8 M +Installing dependencies: + mpdecimal x86_64 2.5.1-3.amzn2023.0.3 amazonlinux 101 k + python3.11-libs x86_64 3.11.17-1.amzn2023.0.1 amazonlinux 9.7 M + python3.11-pip-wheel noarch 22.3.1-2.amzn2023.0.15 amazonlinux 1.4 M + python3.11-setuptools-wheel noarch 65.5.1-2.amzn2023.0.7 amazonlinux 717 k +Installing weak dependencies: + libxcrypt-compat x86_64 4.4.33-7.amzn2023 amazonlinux 92 k + python3.11-setuptools noarch 65.5.1-2.amzn2023.0.7 amazonlinux 1.5 M + +Transaction Summary +================================================================================ +Install 8 Packages + +Total download size: 16 M +Installed size: 68 M +Downloading Packages: +(1/8): libxcrypt-compat-4.4.33-7.amzn2023.x86_6 3.2 MB/s | 92 kB 00:00 +(2/8): python3.11-3.11.17-1.amzn2023.0.1.x86_64 975 kB/s | 28 kB 00:00 +(3/8): mpdecimal-2.5.1-3.amzn2023.0.3.x86_64.rp 3.3 MB/s | 101 kB 00:00 +(4/8): python3.11-pip-wheel-22.3.1-2.amzn2023.0 44 MB/s | 1.4 MB 00:00 +(5/8): python3.11-pip-22.3.1-2.amzn2023.0.15.no 69 MB/s | 2.8 MB 00:00 +(6/8): python3.11-setuptools-65.5.1-2.amzn2023. 41 MB/s | 1.5 MB 00:00 +(7/8): python3.11-setuptools-wheel-65.5.1-2.amz 19 MB/s | 717 kB 00:00 +(8/8): python3.11-libs-3.11.17-1.amzn2023.0.1.x 81 MB/s | 9.7 MB 00:00 +-------------------------------------------------------------------------------- +Total 86 MB/s | 16 MB 00:00 +Running transaction check +Transaction check succeeded. +Running transaction test +Transaction test succeeded. +Running transaction + Preparing : 1/1 + Installing : libxcrypt-compat-4.4.33-7.amzn2023.x86_64 1/8 + Installing : python3.11-pip-wheel-22.3.1-2.amzn2023.0.15.noarch 2/8 + Installing : python3.11-setuptools-wheel-65.5.1-2.amzn2023.0.7.no 3/8 + Installing : mpdecimal-2.5.1-3.amzn2023.0.3.x86_64 4/8 + Installing : python3.11-3.11.17-1.amzn2023.0.1.x86_64 5/8 + Installing : python3.11-libs-3.11.17-1.amzn2023.0.1.x86_64 6/8 + Installing : python3.11-setuptools-65.5.1-2.amzn2023.0.7.noarch 7/8 + Installing : python3.11-pip-22.3.1-2.amzn2023.0.15.noarch 8/8 + Running scriptlet: python3.11-pip-22.3.1-2.amzn2023.0.15.noarch 8/8 + Verifying : libxcrypt-compat-4.4.33-7.amzn2023.x86_64 1/8 + Verifying : mpdecimal-2.5.1-3.amzn2023.0.3.x86_64 2/8 + Verifying : python3.11-3.11.17-1.amzn2023.0.1.x86_64 3/8 + Verifying : python3.11-libs-3.11.17-1.amzn2023.0.1.x86_64 4/8 + Verifying : python3.11-pip-22.3.1-2.amzn2023.0.15.noarch 5/8 + Verifying : python3.11-pip-wheel-22.3.1-2.amzn2023.0.15.noarch 6/8 + Verifying : python3.11-setuptools-65.5.1-2.amzn2023.0.7.noarch 7/8 + Verifying : python3.11-setuptools-wheel-65.5.1-2.amzn2023.0.7.no 8/8 + +Installed: + libxcrypt-compat-4.4.33-7.amzn2023.x86_64 + mpdecimal-2.5.1-3.amzn2023.0.3.x86_64 + python3.11-3.11.17-1.amzn2023.0.1.x86_64 + python3.11-libs-3.11.17-1.amzn2023.0.1.x86_64 + python3.11-pip-22.3.1-2.amzn2023.0.15.noarch + python3.11-pip-wheel-22.3.1-2.amzn2023.0.15.noarch + python3.11-setuptools-65.5.1-2.amzn2023.0.7.noarch + python3.11-setuptools-wheel-65.5.1-2.amzn2023.0.7.noarch + +Complete! ++ dnf install -y ffmpeg-free +Last metadata expiration check: 0:00:05 ago on Tue Oct 27 02:18:53 2026. +No match for argument: ffmpeg-free +Error: Unable to find a match: ffmpeg-free ++ echo 'ffmpeg-free not available (not needed: engine reads video through PyAV)' +ffmpeg-free not available (not needed: engine reads video through PyAV) ++ mkdir -p /opt/gp ++ cd /opt/gp ++ aws s3 cp s3://orchard-bench-768669378827/src/src.zip src.zip +Completed 629.7 KiB/629.7 KiB (6.0 MiB/s) with 1 file(s) remaining download: s3://orchard-bench-768669378827/src/src.zip to ./src.zip ++ unzip -q -o src.zip ++ aws s3 cp s3://orchard-bench-768669378827/src/inputs.txt bench/inputs.txt +Completed 301 Bytes/301 Bytes (8.2 KiB/s) with 1 file(s) remaining download: s3://orchard-bench-768669378827/src/inputs.txt to bench/inputs.txt ++ mkdir -p data/public data/gridlog_empty ++ aws s3 cp s3://orchard-bench-768669378827/src/fluorescent_beat_effect.mp4 data/public/fluorescent_beat_effect.mp4 +Completed 8.9 MiB/8.9 MiB (53.9 MiB/s) with 1 file(s) remaining download: s3://orchard-bench-768669378827/src/fluorescent_beat_effect.mp4 to data/public/fluorescent_beat_effect.mp4 ++ sha256sum data/public/fluorescent_beat_effect.mp4 +b1101d4f30371132a23ddf4da29e03dc48db9731ba04b0fffb81d3afb5474db4 data/public/fluorescent_beat_effect.mp4 ++ python3.11 -m pip install --no-cache-dir opencv-python-headless==5.0.0.93 numpy==2.4.6 av==18.1.0 pyyaml==6.0.3 pydantic==2.14.1 jinja2==3.1.6 matplotlib==3.11.2 +Collecting opencv-python-headless==5.0.0.93 + Downloading opencv_python_headless-5.0.0.93-cp37-abi3-manylinux_2_28_x86_64.whl (61.2 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.2/61.2 MB 246.3 MB/s eta 0:00:00 +Collecting numpy==2.4.6 + Downloading numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (16.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.9/16.9 MB 223.3 MB/s eta 0:00:00 +Collecting av==18.1.0 + Downloading av-18.1.0-cp311-abi3-manylinux_2_28_x86_64.whl (35.8 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 35.8/35.8 MB 61.1 MB/s eta 0:00:00 +Collecting pyyaml==6.0.3 + Downloading pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (806 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 806.6/806.6 kB 40.7 MB/s eta 0:00:00 +Collecting pydantic==2.14.1 + Downloading pydantic-2.14.1-py3-none-any.whl (488 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 488.1/488.1 kB 91.3 MB/s eta 0:00:00 +Collecting jinja2==3.1.6 + Downloading jinja2-3.1.6-py3-none-any.whl (134 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.9/134.9 kB 649.0 MB/s eta 0:00:00 +Collecting matplotlib==3.11.2 + Downloading matplotlib-3.11.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (9.9 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.9/9.9 MB 261.7 MB/s eta 0:00:00 +Collecting annotated-types>=0.6.0 + Downloading annotated_types-0.8.0-py3-none-any.whl (13 kB) +Collecting pydantic-core==2.50.1 + Downloading pydantic_core-2.50.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 91.3 MB/s eta 0:00:00 +Collecting typing-extensions>=4.16.0 + Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 45.6/45.6 kB 31.4 MB/s eta 0:00:00 +Collecting typing-inspection>=0.4.4 + Downloading typing_inspection-0.4.4-py3-none-any.whl (14 kB) +Collecting MarkupSafe>=2.0 + Downloading markupsafe-3.0.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB) +Collecting contourpy>=1.0.1 + Downloading contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (355 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 355.2/355.2 kB 191.1 MB/s eta 0:00:00 +Collecting cycler>=0.10 + Downloading cycler-0.12.1-py3-none-any.whl (8.3 kB) +Collecting fonttools>=4.28.2 + Downloading fonttools-4.67.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (5.5 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.5/5.5 MB 176.4 MB/s eta 0:00:00 +Collecting kiwisolver>=1.3.1 + Downloading kiwisolver-1.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (1.4 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.4/1.4 MB 617.4 MB/s eta 0:00:00 +Collecting packaging>=20.0 + Downloading packaging-26.3-py3-none-any.whl (129 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 130.0/130.0 kB 672.3 MB/s eta 0:00:00 +Collecting pillow>=9 + Downloading pillow-13.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (7.1 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.1/7.1 MB 160.6 MB/s eta 0:00:00 +Collecting pyparsing>=3 + Downloading pyparsing-3.3.3-py3-none-any.whl (126 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 126.4/126.4 kB 614.1 MB/s eta 0:00:00 +Collecting python-dateutil>=2.7 + Downloading python_dateutil-3.0.0-py2.py3-none-any.whl (94 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 94.7/94.7 kB 497.6 MB/s eta 0:00:00 +Collecting six>=1.6 + Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) +Collecting tzdata + Downloading tzdata-2026.5-py2.py3-none-any.whl (347 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 348.0/348.0 kB 744.0 MB/s eta 0:00:00 +Installing collected packages: tzdata, typing-extensions, six, pyyaml, pyparsing, pillow, packaging, numpy, MarkupSafe, kiwisolver, fonttools, cycler, av, annotated-types, typing-inspection, python-dateutil, pydantic-core, opencv-python-headless, jinja2, contourpy, pydantic, matplotlib +Successfully installed MarkupSafe-3.0.4 annotated-types-0.8.0 av-18.1.0 contourpy-1.3.3 cycler-0.12.1 fonttools-4.67.0 jinja2-3.1.6 kiwisolver-1.5.1 matplotlib-3.11.2 numpy-2.4.6 opencv-python-headless-5.0.0.93 packaging-26.3 pillow-13.0.0 pydantic-2.14.1 pydantic-core-2.50.1 pyparsing-3.3.3 python-dateutil-3.0.0 pyyaml-6.0.3 six-1.17.0 typing-extensions-4.16.0 typing-inspection-0.4.4 tzdata-2026.5 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv ++ mkdir -p results/bench/2026-10-27/evidence/A ++ EV=results/bench/2026-10-27/evidence/A ++ python3.11 -m pip freeze ++ lscpu ++ cat /etc/os-release +++ curl -s -X PUT http://169.254.169.254/latest/api/token -H 'X-aws-ec2-metadata-token-ttl-seconds: 300' ++ curl -s -H 'X-aws-ec2-metadata-token: AQAEABWK9pvFhiLM4oZ00QfXUN2FcwYj0wo8wc8eakmvOLaJv1Nvaw==' http://169.254.169.254/latest/dynamic/instance-identity/document ++ export PYTHONPATH=.:engine ++ PYTHONPATH=.:engine ++ export MPLBACKEND=Agg ++ MPLBACKEND=Agg ++ python3.11 -m bench.cool_evidence --label A +{"out_dir": "/opt/gp/results/bench/2026-10-27/evidence/A", "perf": "skipped"} ++ python3.11 -m bench.run_bench --config A --runs 5 --inputs bench/inputs.txt --date 2026-10-27 +{ + "throughput_video_s_per_wall_s": { + "mean": 0.916141939312045, + "std": 0.0028058387337305908, + "per_run": [ + 0.9132296027448652, + 0.9161071797527053, + 0.9136498293680508, + 0.917860313557364, + 0.9198627711372399 + ] + }, + "stage_latency_s": { + "S12_face": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S1_ingest": { + "p50": 0.9612, + "p95": 0.96564 + }, + "S2_linear": { + "p50": 5.1233, + "p95": 5.20442 + }, + "S3_readout": { + "p50": 4.0016, + "p95": 4.0503 + }, + "S4_motion": { + "p50": 2.3848, + "p95": 2.39186 + }, + "S5_segment": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S6_patches": { + "p50": 1.9642, + "p95": 1.9734 + }, + "S7_rowsignal": { + "p50": 0.7521, + "p95": 0.75652 + }, + "S8_phase": { + "p50": 1.614, + "p95": 1.63204 + } + }, + "cpu_util_mean": 0.18032641388804513, + "peak_rss_mb_max": 1999.91796875, + "config": "A", + "machine": "x86_64", + "platform": "Linux-6.18.56-125.164.amzn2023.x86_64-x86_64-with-glibc2.34", + "cpu_count": 8, + "opencv_version": "5.0.0", + "date": "2026-10-27T02:20:35.668823+00:00", + "inputs_file": "/opt/gp/bench/inputs.txt", + "runs": 5 +} ++ rm -rf results/bench/2026-10-27/A/work ++ aws s3 cp --recursive results/bench/2026-10-27/A s3://orchard-bench-768669378827/runs/2026-10-27/A/A +Completed 1.1 KiB/4.0 KiB (31.3 KiB/s) with 3 file(s) remaining upload: results/bench/2026-10-27/A/summary.json to s3://orchard-bench-768669378827/runs/2026-10-27/A/A/summary.json +Completed 1.1 KiB/4.0 KiB (31.3 KiB/s) with 2 file(s) remaining Completed 1.6 KiB/4.0 KiB (36.4 KiB/s) with 2 file(s) remaining upload: results/bench/2026-10-27/A/tracks.npz to s3://orchard-bench-768669378827/runs/2026-10-27/A/A/tracks.npz +Completed 1.6 KiB/4.0 KiB (36.4 KiB/s) with 1 file(s) remaining Completed 4.0 KiB/4.0 KiB (85.5 KiB/s) with 1 file(s) remaining upload: results/bench/2026-10-27/A/runs.json to s3://orchard-bench-768669378827/runs/2026-10-27/A/A/runs.json ++ aws s3 cp --recursive results/bench/2026-10-27/evidence/A s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A +Completed 7.4 KiB/16.4 KiB (182.5 KiB/s) with 8 file(s) remaining upload: results/bench/2026-10-27/evidence/A/build_information.txt to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/build_information.txt +Completed 7.4 KiB/16.4 KiB (182.5 KiB/s) with 7 file(s) remaining Completed 7.9 KiB/16.4 KiB (176.9 KiB/s) with 7 file(s) remaining upload: results/bench/2026-10-27/evidence/A/instance_identity.json to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/instance_identity.json +Completed 7.9 KiB/16.4 KiB (176.9 KiB/s) with 6 file(s) remaining Completed 11.3 KiB/16.4 KiB (247.4 KiB/s) with 6 file(s) remaining upload: results/bench/2026-10-27/evidence/A/loaded_libraries.txt to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/loaded_libraries.txt +Completed 11.3 KiB/16.4 KiB (247.4 KiB/s) with 5 file(s) remaining Completed 11.8 KiB/16.4 KiB (250.9 KiB/s) with 5 file(s) remaining upload: results/bench/2026-10-27/evidence/A/os_release.txt to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/os_release.txt +Completed 11.8 KiB/16.4 KiB (250.9 KiB/s) with 4 file(s) remaining Completed 12.2 KiB/16.4 KiB (251.7 KiB/s) with 4 file(s) remaining upload: results/bench/2026-10-27/evidence/A/pip_freeze.txt to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/pip_freeze.txt +Completed 12.2 KiB/16.4 KiB (251.7 KiB/s) with 3 file(s) remaining Completed 15.6 KiB/16.4 KiB (306.2 KiB/s) with 3 file(s) remaining upload: results/bench/2026-10-27/evidence/A/lscpu.txt to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/lscpu.txt +Completed 15.6 KiB/16.4 KiB (306.2 KiB/s) with 2 file(s) remaining Completed 15.9 KiB/16.4 KiB (309.8 KiB/s) with 2 file(s) remaining upload: results/bench/2026-10-27/evidence/A/versions.json to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/versions.json +Completed 15.9 KiB/16.4 KiB (309.8 KiB/s) with 1 file(s) remaining Completed 16.4 KiB/16.4 KiB (274.9 KiB/s) with 1 file(s) remaining upload: results/bench/2026-10-27/evidence/A/manifest.json to s3://orchard-bench-768669378827/runs/2026-10-27/A/evidence/A/manifest.json ++ finish ++ rc=0 +++ date -u +%FT%TZ ++ echo 'EXIT rc=0 2026-10-27T02:20:36Z' +EXIT rc=0 2026-10-27T02:20:36Z ++ aws s3 cp /var/log/gridprint-bench.log s3://orchard-bench-768669378827/runs/2026-10-27/A/bench.log diff --git a/results/bench/2026-10-27/logs/B.bench.log b/results/bench/2026-10-27/logs/B.bench.log new file mode 100644 index 0000000..3af2aad --- /dev/null +++ b/results/bench/2026-10-27/logs/B.bench.log @@ -0,0 +1,250 @@ +Shutdown scheduled for Tue 2026-10-27 03:33:41 UTC, use 'shutdown -c' to cancel. ++ date -u +%FT%TZ +2026-10-27T02:18:41Z ++ uname -a +Linux ip-172-31-8-76.ec2.internal 6.18.56-125.164.amzn2023.aarch64 #2 SMP Mon Oct 19 19:40:01 UTC 2026 aarch64 aarch64 aarch64 GNU/Linux ++ dnf install -y python3.11 python3.11-pip unzip +Amazon Linux 2023 repository 58 MB/s | 85 MB 00:01 +Amazon Linux 2023 Kernel Livepatch repository 899 kB/s | 87 kB 00:00 +Package unzip-6.0-68.amzn2023.0.2.aarch64 is already installed. +Dependencies resolved. +================================================================================ + Package Arch Version Repository Size +================================================================================ +Installing: + python3.11 aarch64 3.11.17-1.amzn2023.0.1 amazonlinux 29 k + python3.11-pip noarch 22.3.1-2.amzn2023.0.15 amazonlinux 2.8 M +Installing dependencies: + mpdecimal aarch64 2.5.1-3.amzn2023.0.3 amazonlinux 103 k + python3.11-libs aarch64 3.11.17-1.amzn2023.0.1 amazonlinux 9.7 M + python3.11-pip-wheel noarch 22.3.1-2.amzn2023.0.15 amazonlinux 1.4 M + python3.11-setuptools-wheel noarch 65.5.1-2.amzn2023.0.7 amazonlinux 717 k +Installing weak dependencies: + python3.11-setuptools noarch 65.5.1-2.amzn2023.0.7 amazonlinux 1.5 M + +Transaction Summary +================================================================================ +Install 7 Packages + +Total download size: 16 M +Installed size: 78 M +Downloading Packages: +(1/7): python3.11-3.11.17-1.amzn2023.0.1.aarch6 992 kB/s | 29 kB 00:00 +(2/7): mpdecimal-2.5.1-3.amzn2023.0.3.aarch64.r 2.7 MB/s | 103 kB 00:00 +(3/7): python3.11-pip-22.3.1-2.amzn2023.0.15.no 64 MB/s | 2.8 MB 00:00 +(4/7): python3.11-pip-wheel-22.3.1-2.amzn2023.0 31 MB/s | 1.4 MB 00:00 +(5/7): python3.11-libs-3.11.17-1.amzn2023.0.1.a 74 MB/s | 9.7 MB 00:00 +(6/7): python3.11-setuptools-65.5.1-2.amzn2023. 23 MB/s | 1.5 MB 00:00 +(7/7): python3.11-setuptools-wheel-65.5.1-2.amz 13 MB/s | 717 kB 00:00 +-------------------------------------------------------------------------------- +Total 88 MB/s | 16 MB 00:00 +Running transaction check +Transaction check succeeded. +Running transaction test +Transaction test succeeded. +Running transaction + Preparing : 1/1 + Installing : python3.11-setuptools-wheel-65.5.1-2.amzn2023.0.7.no 1/7 + Installing : python3.11-pip-wheel-22.3.1-2.amzn2023.0.15.noarch 2/7 + Installing : mpdecimal-2.5.1-3.amzn2023.0.3.aarch64 3/7 + Installing : python3.11-3.11.17-1.amzn2023.0.1.aarch64 4/7 + Installing : python3.11-libs-3.11.17-1.amzn2023.0.1.aarch64 5/7 + Installing : python3.11-setuptools-65.5.1-2.amzn2023.0.7.noarch 6/7 + Installing : python3.11-pip-22.3.1-2.amzn2023.0.15.noarch 7/7 + Running scriptlet: python3.11-pip-22.3.1-2.amzn2023.0.15.noarch 7/7 + Verifying : mpdecimal-2.5.1-3.amzn2023.0.3.aarch64 1/7 + Verifying : python3.11-3.11.17-1.amzn2023.0.1.aarch64 2/7 + Verifying : python3.11-libs-3.11.17-1.amzn2023.0.1.aarch64 3/7 + Verifying : python3.11-pip-22.3.1-2.amzn2023.0.15.noarch 4/7 + Verifying : python3.11-pip-wheel-22.3.1-2.amzn2023.0.15.noarch 5/7 + Verifying : python3.11-setuptools-65.5.1-2.amzn2023.0.7.noarch 6/7 + Verifying : python3.11-setuptools-wheel-65.5.1-2.amzn2023.0.7.no 7/7 + +Installed: + mpdecimal-2.5.1-3.amzn2023.0.3.aarch64 + python3.11-3.11.17-1.amzn2023.0.1.aarch64 + python3.11-libs-3.11.17-1.amzn2023.0.1.aarch64 + python3.11-pip-22.3.1-2.amzn2023.0.15.noarch + python3.11-pip-wheel-22.3.1-2.amzn2023.0.15.noarch + python3.11-setuptools-65.5.1-2.amzn2023.0.7.noarch + python3.11-setuptools-wheel-65.5.1-2.amzn2023.0.7.noarch + +Complete! ++ dnf install -y ffmpeg-free +Last metadata expiration check: 0:00:06 ago on Tue Oct 27 02:18:55 2026. +No match for argument: ffmpeg-free +Error: Unable to find a match: ffmpeg-free ++ echo 'ffmpeg-free not available (not needed: engine reads video through PyAV)' +ffmpeg-free not available (not needed: engine reads video through PyAV) ++ mkdir -p /opt/gp ++ cd /opt/gp ++ aws s3 cp s3://orchard-bench-768669378827/src/src.zip src.zip +Completed 629.7 KiB/629.7 KiB (8.9 MiB/s) with 1 file(s) remaining download: s3://orchard-bench-768669378827/src/src.zip to ./src.zip ++ unzip -q -o src.zip ++ aws s3 cp s3://orchard-bench-768669378827/src/inputs.txt bench/inputs.txt +Completed 301 Bytes/301 Bytes (8.9 KiB/s) with 1 file(s) remaining download: s3://orchard-bench-768669378827/src/inputs.txt to bench/inputs.txt ++ mkdir -p data/public data/gridlog_empty ++ aws s3 cp s3://orchard-bench-768669378827/src/fluorescent_beat_effect.mp4 data/public/fluorescent_beat_effect.mp4 +Completed 8.9 MiB/8.9 MiB (72.7 MiB/s) with 1 file(s) remaining download: s3://orchard-bench-768669378827/src/fluorescent_beat_effect.mp4 to data/public/fluorescent_beat_effect.mp4 ++ sha256sum data/public/fluorescent_beat_effect.mp4 +b1101d4f30371132a23ddf4da29e03dc48db9731ba04b0fffb81d3afb5474db4 data/public/fluorescent_beat_effect.mp4 ++ python3.11 -m pip install --no-cache-dir opencv-python-headless==5.0.0.93 numpy==2.4.6 av==18.1.0 pyyaml==6.0.3 pydantic==2.14.1 jinja2==3.1.6 matplotlib==3.11.2 +Collecting opencv-python-headless==5.0.0.93 + Downloading opencv_python_headless-5.0.0.93-cp37-abi3-manylinux_2_28_aarch64.whl (39.6 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 39.6/39.6 MB 451.3 MB/s eta 0:00:00 +Collecting numpy==2.4.6 + Downloading numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (16.0 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.0/16.0 MB 587.8 MB/s eta 0:00:00 +Collecting av==18.1.0 + Downloading av-18.1.0-cp311-abi3-manylinux_2_28_aarch64.whl (33.6 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 33.6/33.6 MB 224.4 MB/s eta 0:00:00 +Collecting pyyaml==6.0.3 + Downloading pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (775 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 775.6/775.6 kB 637.5 MB/s eta 0:00:00 +Collecting pydantic==2.14.1 + Downloading pydantic-2.14.1-py3-none-any.whl (488 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 488.1/488.1 kB 644.9 MB/s eta 0:00:00 +Collecting jinja2==3.1.6 + Downloading jinja2-3.1.6-py3-none-any.whl (134 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.9/134.9 kB 562.1 MB/s eta 0:00:00 +Collecting matplotlib==3.11.2 + Downloading matplotlib-3.11.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (10.7 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.7/10.7 MB 281.6 MB/s eta 0:00:00 +Collecting annotated-types>=0.6.0 + Downloading annotated_types-0.8.0-py3-none-any.whl (13 kB) +Collecting pydantic-core==2.50.1 + Downloading pydantic_core-2.50.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.0 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 428.0 MB/s eta 0:00:00 +Collecting typing-extensions>=4.16.0 + Downloading typing_extensions-4.16.0-py3-none-any.whl (45 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 45.6/45.6 kB 389.3 MB/s eta 0:00:00 +Collecting typing-inspection>=0.4.4 + Downloading typing_inspection-0.4.4-py3-none-any.whl (14 kB) +Collecting MarkupSafe>=2.0 + Downloading markupsafe-3.0.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (24 kB) +Collecting contourpy>=1.0.1 + Downloading contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl (329 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 329.2/329.2 kB 517.0 MB/s eta 0:00:00 +Collecting cycler>=0.10 + Downloading cycler-0.12.1-py3-none-any.whl (8.3 kB) +Collecting fonttools>=4.28.2 + Downloading fonttools-4.67.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (5.5 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.5/5.5 MB 196.1 MB/s eta 0:00:00 +Collecting kiwisolver>=1.3.1 + Downloading kiwisolver-1.5.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl (1.2 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 658.9 MB/s eta 0:00:00 +Collecting packaging>=20.0 + Downloading packaging-26.3-py3-none-any.whl (129 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 130.0/130.0 kB 545.8 MB/s eta 0:00:00 +Collecting pillow>=9 + Downloading pillow-13.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (6.5 MB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.5/6.5 MB 471.3 MB/s eta 0:00:00 +Collecting pyparsing>=3 + Downloading pyparsing-3.3.3-py3-none-any.whl (126 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 126.4/126.4 kB 546.6 MB/s eta 0:00:00 +Collecting python-dateutil>=2.7 + Downloading python_dateutil-3.0.0-py2.py3-none-any.whl (94 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 94.7/94.7 kB 502.2 MB/s eta 0:00:00 +Collecting six>=1.6 + Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) +Collecting tzdata + Downloading tzdata-2026.5-py2.py3-none-any.whl (347 kB) + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 348.0/348.0 kB 614.9 MB/s eta 0:00:00 +Installing collected packages: tzdata, typing-extensions, six, pyyaml, pyparsing, pillow, packaging, numpy, MarkupSafe, kiwisolver, fonttools, cycler, av, annotated-types, typing-inspection, python-dateutil, pydantic-core, opencv-python-headless, jinja2, contourpy, pydantic, matplotlib +Successfully installed MarkupSafe-3.0.4 annotated-types-0.8.0 av-18.1.0 contourpy-1.3.3 cycler-0.12.1 fonttools-4.67.0 jinja2-3.1.6 kiwisolver-1.5.1 matplotlib-3.11.2 numpy-2.4.6 opencv-python-headless-5.0.0.93 packaging-26.3 pillow-13.0.0 pydantic-2.14.1 pydantic-core-2.50.1 pyparsing-3.3.3 python-dateutil-3.0.0 pyyaml-6.0.3 six-1.17.0 typing-extensions-4.16.0 typing-inspection-0.4.4 tzdata-2026.5 +WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv ++ mkdir -p results/bench/2026-10-27/evidence/B ++ EV=results/bench/2026-10-27/evidence/B ++ python3.11 -m pip freeze ++ lscpu ++ cat /etc/os-release +++ curl -s -X PUT http://169.254.169.254/latest/api/token -H 'X-aws-ec2-metadata-token-ttl-seconds: 300' ++ curl -s -H 'X-aws-ec2-metadata-token: AQAEAKpEOzpl6ZOFBpvVOYDPa43JbgVKmYxfZeOCB2SMDZtfYINQyQ==' http://169.254.169.254/latest/dynamic/instance-identity/document ++ export PYTHONPATH=.:engine ++ PYTHONPATH=.:engine ++ export MPLBACKEND=Agg ++ MPLBACKEND=Agg ++ python3.11 -m bench.cool_evidence --label B +{"out_dir": "/opt/gp/results/bench/2026-10-27/evidence/B", "perf": "skipped"} ++ python3.11 -m bench.run_bench --config B --runs 5 --inputs bench/inputs.txt --date 2026-10-27 +{ + "throughput_video_s_per_wall_s": { + "mean": 1.201048467324347, + "std": 0.0022927245185856136, + "per_run": [ + 1.198488763471267, + 1.198595721250623, + 1.2028849302760998, + 1.2027818103024939, + 1.2024911113212509 + ] + }, + "stage_latency_s": { + "S12_face": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S1_ingest": { + "p50": 1.038, + "p95": 1.04446 + }, + "S2_linear": { + "p50": 4.2415, + "p95": 4.2557 + }, + "S3_readout": { + "p50": 3.3237, + "p95": 3.34104 + }, + "S4_motion": { + "p50": 1.6458, + "p95": 1.6516 + }, + "S5_segment": { + "p50": 0.0001, + "p95": 0.0001 + }, + "S6_patches": { + "p50": 1.1428, + "p95": 1.1467399999999999 + }, + "S7_rowsignal": { + "p50": 0.4103, + "p95": 0.41093999999999997 + }, + "S8_phase": { + "p50": 0.9777, + "p95": 0.9848 + } + }, + "cpu_util_mean": 0.17440271177861205, + "peak_rss_mb_max": 1957.79296875, + "config": "B", + "machine": "aarch64", + "platform": "Linux-6.18.56-125.164.amzn2023.aarch64-aarch64-with-glibc2.34", + "cpu_count": 8, + "opencv_version": "5.0.0", + "date": "2026-10-27T02:20:17.891199+00:00", + "inputs_file": "/opt/gp/bench/inputs.txt", + "runs": 5 +} ++ rm -rf results/bench/2026-10-27/B/work ++ aws s3 cp --recursive results/bench/2026-10-27/B s3://orchard-bench-768669378827/runs/2026-10-27/B/B +Completed 2.4 KiB/4.0 KiB (61.2 KiB/s) with 3 file(s) remaining upload: results/bench/2026-10-27/B/runs.json to s3://orchard-bench-768669378827/runs/2026-10-27/B/B/runs.json +Completed 2.4 KiB/4.0 KiB (61.2 KiB/s) with 2 file(s) remaining Completed 2.9 KiB/4.0 KiB (62.6 KiB/s) with 2 file(s) remaining upload: results/bench/2026-10-27/B/tracks.npz to s3://orchard-bench-768669378827/runs/2026-10-27/B/B/tracks.npz +Completed 2.9 KiB/4.0 KiB (62.6 KiB/s) with 1 file(s) remaining Completed 4.0 KiB/4.0 KiB (76.4 KiB/s) with 1 file(s) remaining upload: results/bench/2026-10-27/B/summary.json to s3://orchard-bench-768669378827/runs/2026-10-27/B/B/summary.json ++ aws s3 cp --recursive results/bench/2026-10-27/evidence/B s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B +Completed 477 Bytes/14.5 KiB (11.8 KiB/s) with 8 file(s) remaining upload: results/bench/2026-10-27/evidence/B/instance_identity.json to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/instance_identity.json +Completed 477 Bytes/14.5 KiB (11.8 KiB/s) with 7 file(s) remaining Completed 2.8 KiB/14.5 KiB (64.6 KiB/s) with 7 file(s) remaining upload: results/bench/2026-10-27/evidence/B/lscpu.txt to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/lscpu.txt +Completed 2.8 KiB/14.5 KiB (64.6 KiB/s) with 6 file(s) remaining Completed 3.3 KiB/14.5 KiB (74.6 KiB/s) with 6 file(s) remaining upload: results/bench/2026-10-27/evidence/B/manifest.json to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/manifest.json +Completed 3.3 KiB/14.5 KiB (74.6 KiB/s) with 5 file(s) remaining Completed 6.5 KiB/14.5 KiB (144.8 KiB/s) with 5 file(s) remaining upload: results/bench/2026-10-27/evidence/B/loaded_libraries.txt to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/loaded_libraries.txt +Completed 6.5 KiB/14.5 KiB (144.8 KiB/s) with 4 file(s) remaining Completed 13.3 KiB/14.5 KiB (293.0 KiB/s) with 4 file(s) remaining upload: results/bench/2026-10-27/evidence/B/build_information.txt to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/build_information.txt +Completed 13.3 KiB/14.5 KiB (293.0 KiB/s) with 3 file(s) remaining Completed 13.8 KiB/14.5 KiB (258.5 KiB/s) with 3 file(s) remaining upload: results/bench/2026-10-27/evidence/B/os_release.txt to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/os_release.txt +Completed 13.8 KiB/14.5 KiB (258.5 KiB/s) with 2 file(s) remaining Completed 14.1 KiB/14.5 KiB (246.4 KiB/s) with 2 file(s) remaining upload: results/bench/2026-10-27/evidence/B/versions.json to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/versions.json +Completed 14.1 KiB/14.5 KiB (246.4 KiB/s) with 1 file(s) remaining Completed 14.5 KiB/14.5 KiB (237.3 KiB/s) with 1 file(s) remaining upload: results/bench/2026-10-27/evidence/B/pip_freeze.txt to s3://orchard-bench-768669378827/runs/2026-10-27/B/evidence/B/pip_freeze.txt ++ finish ++ rc=0 +++ date -u +%FT%TZ ++ echo 'EXIT rc=0 2026-10-27T02:20:18Z' +EXIT rc=0 2026-10-27T02:20:18Z ++ aws s3 cp /var/log/gridprint-bench.log s3://orchard-bench-768669378827/runs/2026-10-27/B/bench.log diff --git a/results/bench/2026-10-27/parity.json b/results/bench/2026-10-27/parity.json new file mode 100644 index 0000000..ec40bea --- /dev/null +++ b/results/bench/2026-10-27/parity.json @@ -0,0 +1,12 @@ +{ + "tolerance_hz": 0.001, + "pairs": [ + { + "a": "A", + "b": "B", + "max_abs_enf_diff_hz": 0.5677151317372662, + "within_tolerance": false, + "verdicts_identical": true + } + ] +} \ No newline at end of file diff --git a/results/bench/2026-10-27/prices.json b/results/bench/2026-10-27/prices.json new file mode 100644 index 0000000..69421d5 --- /dev/null +++ b/results/bench/2026-10-27/prices.json @@ -0,0 +1,897 @@ +{ + "location": "US East (N. Virginia)", + "prices": { + "c7i.2xlarge": { + "attributes": { + "capacitystatus": "Used", + "instanceType": "c7i.2xlarge", + "location": "US East (N. Virginia)", + "memory": "16 GiB", + "operatingSystem": "Linux", + "physicalProcessor": "Intel Xeon Scalable (Sapphire Rapids)", + "preInstalledSw": "NA", + "regionCode": "us-east-1", + "tenancy": "Shared", + "vcpu": "8" + }, + "description": "$0.357 per On Demand Linux c7i.2xlarge Instance Hour", + "effective_date": "2026-10-01T00:00:00Z", + "offer_term_code": "D23DFG4YVGYMSX7G.JRTCKXETXF", + "rate_code": "D23DFG4YVGYMSX7G.JRTCKXETXF.6YS6EN2CT7", + "sku": "D23DFG4YVGYMSX7G", + "unit": "Hrs", + "usd_per_hour": 0.357 + }, + "c8g.2xlarge": { + "attributes": { + "capacitystatus": "Used", + "instanceType": "c8g.2xlarge", + "location": "US East (N. Virginia)", + "memory": "16 GiB", + "operatingSystem": "Linux", + "physicalProcessor": "AWS Graviton4 Processor", + "preInstalledSw": "NA", + "regionCode": "us-east-1", + "tenancy": "Shared", + "vcpu": "8" + }, + "description": "$0.31904 per On Demand Linux c8g.2xlarge Instance Hour", + "effective_date": "2026-10-01T00:00:00Z", + "offer_term_code": "37DD9F3G2Q3TQYYE.JRTCKXETXF", + "rate_code": "37DD9F3G2Q3TQYYE.JRTCKXETXF.6YS6EN2CT7", + "sku": "37DD9F3G2Q3TQYYE", + "unit": "Hrs", + "usd_per_hour": 0.31904 + } + }, + "query_date_utc": "2026-10-27", + "raw": { + "c7i.2xlarge": [ + { + "product": { + "attributes": { + "availabilityzone": "NA", + "capacitystatus": "Used", + "classicnetworkingsupport": "false", + "clockSpeed": "3.2 GHz", + "currentGeneration": "Yes", + "dedicatedEbsThroughput": "Up to 10000 Mbps", + "dedicatedEbsThroughputDescription": "2500 Mbps", + "ecu": "NA", + "enhancedNetworkingSupported": "Yes", + "gpuMemory": "NA", + "instanceFamily": "Compute optimized", + "instanceFamilyCategory": "Compute Optimized", + "instanceType": "c7i.2xlarge", + "intelAvx2Available": "Yes", + "intelAvxAvailable": "Yes", + "intelTurboAvailable": "Yes", + "licenseModel": "No License required", + "location": "US East (N. Virginia)", + "locationType": "AWS Region", + "marketoption": "OnDemand", + "memory": "16 GiB", + "networkPerformance": "Up to 12500 Megabit", + "normalizationSizeFactor": "16", + "operatingSystem": "Linux", + "operation": "RunInstances", + "physicalProcessor": "Intel Xeon Scalable (Sapphire Rapids)", + "preInstalledSw": "NA", + "processorArchitecture": "64-bit", + "processorFeatures": "Intel AVX; Intel AVX2; Intel AVX512; Intel Turbo; Intel AMX", + "regionCode": "us-east-1", + "servicecode": "AmazonEC2", + "servicename": "Amazon Elastic Compute Cloud", + "storage": "EBS only", + "tenancy": "Shared", + "usagetype": "BoxUsage:c7i.2xlarge", + "vcpu": "8", + "vpcnetworkingsupport": "true" + }, + "productFamily": "Compute Instance", + "sku": "D23DFG4YVGYMSX7G" + }, + "publicationDate": "2026-10-23T22:13:55Z", + "serviceCode": "AmazonEC2", + "terms": { + "OnDemand": { + "D23DFG4YVGYMSX7G.JRTCKXETXF": { + "effectiveDate": "2026-10-01T00:00:00Z", + "offerTermCode": "JRTCKXETXF", + "priceDimensions": { + "D23DFG4YVGYMSX7G.JRTCKXETXF.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "$0.357 per On Demand Linux c7i.2xlarge Instance Hour", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.3570000000" + }, + "rateCode": "D23DFG4YVGYMSX7G.JRTCKXETXF.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": {} + } + }, + "Reserved": { + "D23DFG4YVGYMSX7G.38NPMPTW36": { + "effectiveDate": "2026-10-23T22:37:35Z", + "offerTermCode": "38NPMPTW36", + "priceDimensions": { + "D23DFG4YVGYMSX7G.38NPMPTW36.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "1912" + }, + "rateCode": "D23DFG4YVGYMSX7G.38NPMPTW36.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.38NPMPTW36.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0727700000" + }, + "rateCode": "D23DFG4YVGYMSX7G.38NPMPTW36.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "standard", + "PurchaseOption": "Partial Upfront" + } + }, + "D23DFG4YVGYMSX7G.4NA7Y494T4": { + "effectiveDate": "2026-10-23T22:37:31Z", + "offerTermCode": "4NA7Y494T4", + "priceDimensions": { + "D23DFG4YVGYMSX7G.4NA7Y494T4.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.2361600000" + }, + "rateCode": "D23DFG4YVGYMSX7G.4NA7Y494T4.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "standard", + "PurchaseOption": "No Upfront" + } + }, + "D23DFG4YVGYMSX7G.6QCMYABX3D": { + "effectiveDate": "2026-10-23T22:37:30Z", + "offerTermCode": "6QCMYABX3D", + "priceDimensions": { + "D23DFG4YVGYMSX7G.6QCMYABX3D.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "1931" + }, + "rateCode": "D23DFG4YVGYMSX7G.6QCMYABX3D.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.6QCMYABX3D.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "D23DFG4YVGYMSX7G.6QCMYABX3D.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "standard", + "PurchaseOption": "All Upfront" + } + }, + "D23DFG4YVGYMSX7G.7NE97W5U4E": { + "effectiveDate": "2026-10-23T22:37:31Z", + "offerTermCode": "7NE97W5U4E", + "priceDimensions": { + "D23DFG4YVGYMSX7G.7NE97W5U4E.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.2579900000" + }, + "rateCode": "D23DFG4YVGYMSX7G.7NE97W5U4E.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "convertible", + "PurchaseOption": "No Upfront" + } + }, + "D23DFG4YVGYMSX7G.BPH4J8HBKS": { + "effectiveDate": "2026-10-23T22:37:32Z", + "offerTermCode": "BPH4J8HBKS", + "priceDimensions": { + "D23DFG4YVGYMSX7G.BPH4J8HBKS.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1571700000" + }, + "rateCode": "D23DFG4YVGYMSX7G.BPH4J8HBKS.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "standard", + "PurchaseOption": "No Upfront" + } + }, + "D23DFG4YVGYMSX7G.CUZHX8X6JH": { + "effectiveDate": "2026-10-23T22:37:35Z", + "offerTermCode": "CUZHX8X6JH", + "priceDimensions": { + "D23DFG4YVGYMSX7G.CUZHX8X6JH.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "1076" + }, + "rateCode": "D23DFG4YVGYMSX7G.CUZHX8X6JH.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.CUZHX8X6JH.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1228500000" + }, + "rateCode": "D23DFG4YVGYMSX7G.CUZHX8X6JH.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "convertible", + "PurchaseOption": "Partial Upfront" + } + }, + "D23DFG4YVGYMSX7G.HU7G6KETJZ": { + "effectiveDate": "2026-10-23T22:37:32Z", + "offerTermCode": "HU7G6KETJZ", + "priceDimensions": { + "D23DFG4YVGYMSX7G.HU7G6KETJZ.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "985" + }, + "rateCode": "D23DFG4YVGYMSX7G.HU7G6KETJZ.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.HU7G6KETJZ.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1124600000" + }, + "rateCode": "D23DFG4YVGYMSX7G.HU7G6KETJZ.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "standard", + "PurchaseOption": "Partial Upfront" + } + }, + "D23DFG4YVGYMSX7G.MZU6U2429S": { + "effectiveDate": "2026-10-23T22:37:33Z", + "offerTermCode": "MZU6U2429S", + "priceDimensions": { + "D23DFG4YVGYMSX7G.MZU6U2429S.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "4110" + }, + "rateCode": "D23DFG4YVGYMSX7G.MZU6U2429S.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.MZU6U2429S.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "D23DFG4YVGYMSX7G.MZU6U2429S.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "convertible", + "PurchaseOption": "All Upfront" + } + }, + "D23DFG4YVGYMSX7G.NQ3QZPMQV9": { + "effectiveDate": "2026-10-23T22:37:35Z", + "offerTermCode": "NQ3QZPMQV9", + "priceDimensions": { + "D23DFG4YVGYMSX7G.NQ3QZPMQV9.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "3595" + }, + "rateCode": "D23DFG4YVGYMSX7G.NQ3QZPMQV9.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.NQ3QZPMQV9.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "D23DFG4YVGYMSX7G.NQ3QZPMQV9.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "standard", + "PurchaseOption": "All Upfront" + } + }, + "D23DFG4YVGYMSX7G.R5XV2EPZQZ": { + "effectiveDate": "2026-10-23T22:37:32Z", + "offerTermCode": "R5XV2EPZQZ", + "priceDimensions": { + "D23DFG4YVGYMSX7G.R5XV2EPZQZ.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "2097" + }, + "rateCode": "D23DFG4YVGYMSX7G.R5XV2EPZQZ.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.R5XV2EPZQZ.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0798000000" + }, + "rateCode": "D23DFG4YVGYMSX7G.R5XV2EPZQZ.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "convertible", + "PurchaseOption": "Partial Upfront" + } + }, + "D23DFG4YVGYMSX7G.VJWZNREJX2": { + "effectiveDate": "2026-10-23T22:37:38Z", + "offerTermCode": "VJWZNREJX2", + "priceDimensions": { + "D23DFG4YVGYMSX7G.VJWZNREJX2.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "2109" + }, + "rateCode": "D23DFG4YVGYMSX7G.VJWZNREJX2.2TG2D8R56U", + "unit": "Quantity" + }, + "D23DFG4YVGYMSX7G.VJWZNREJX2.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "D23DFG4YVGYMSX7G.VJWZNREJX2.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "convertible", + "PurchaseOption": "All Upfront" + } + }, + "D23DFG4YVGYMSX7G.Z2E3P23VKM": { + "effectiveDate": "2026-10-23T22:37:35Z", + "offerTermCode": "Z2E3P23VKM", + "priceDimensions": { + "D23DFG4YVGYMSX7G.Z2E3P23VKM.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c7i.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1723700000" + }, + "rateCode": "D23DFG4YVGYMSX7G.Z2E3P23VKM.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "D23DFG4YVGYMSX7G", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "convertible", + "PurchaseOption": "No Upfront" + } + } + } + }, + "version": "20261023221355" + } + ], + "c8g.2xlarge": [ + { + "product": { + "attributes": { + "availabilityzone": "NA", + "capacitystatus": "Used", + "classicnetworkingsupport": "false", + "clockSpeed": "2.7 GHz", + "currentGeneration": "Yes", + "dedicatedEbsThroughput": "Up to 10 Gbps", + "dedicatedEbsThroughputDescription": "2500 Mbps", + "ecu": "NA", + "enhancedNetworkingSupported": "Yes", + "gpuMemory": "NA", + "instanceFamily": "Compute optimized", + "instanceFamilyCategory": "Compute Optimized", + "instanceType": "c8g.2xlarge", + "intelAvx2Available": "No", + "intelAvxAvailable": "No", + "intelTurboAvailable": "No", + "licenseModel": "No License required", + "location": "US East (N. Virginia)", + "locationType": "AWS Region", + "marketoption": "OnDemand", + "memory": "16 GiB", + "networkPerformance": "Up to 15 Gigabit", + "normalizationSizeFactor": "16", + "operatingSystem": "Linux", + "operation": "RunInstances", + "physicalProcessor": "AWS Graviton4 Processor", + "preInstalledSw": "NA", + "processorArchitecture": "64-bit", + "regionCode": "us-east-1", + "servicecode": "AmazonEC2", + "servicename": "Amazon Elastic Compute Cloud", + "storage": "EBS only", + "tenancy": "Shared", + "usagetype": "BoxUsage:c8g.2xlarge", + "vcpu": "8", + "vpcnetworkingsupport": "true" + }, + "productFamily": "Compute Instance", + "sku": "37DD9F3G2Q3TQYYE" + }, + "publicationDate": "2026-10-23T22:13:55Z", + "serviceCode": "AmazonEC2", + "terms": { + "OnDemand": { + "37DD9F3G2Q3TQYYE.JRTCKXETXF": { + "effectiveDate": "2026-10-01T00:00:00Z", + "offerTermCode": "JRTCKXETXF", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.JRTCKXETXF.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "$0.31904 per On Demand Linux c8g.2xlarge Instance Hour", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.3190400000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.JRTCKXETXF.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": {} + } + }, + "Reserved": { + "37DD9F3G2Q3TQYYE.38NPMPTW36": { + "effectiveDate": "2026-10-23T22:37:31Z", + "offerTermCode": "38NPMPTW36", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.38NPMPTW36.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "1706" + }, + "rateCode": "37DD9F3G2Q3TQYYE.38NPMPTW36.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.38NPMPTW36.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0649100000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.38NPMPTW36.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "standard", + "PurchaseOption": "Partial Upfront" + } + }, + "37DD9F3G2Q3TQYYE.4NA7Y494T4": { + "effectiveDate": "2026-10-23T22:37:33Z", + "offerTermCode": "4NA7Y494T4", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.4NA7Y494T4.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.2102400000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.4NA7Y494T4.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "standard", + "PurchaseOption": "No Upfront" + } + }, + "37DD9F3G2Q3TQYYE.6QCMYABX3D": { + "effectiveDate": "2026-10-23T22:37:31Z", + "offerTermCode": "6QCMYABX3D", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.6QCMYABX3D.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "1719" + }, + "rateCode": "37DD9F3G2Q3TQYYE.6QCMYABX3D.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.6QCMYABX3D.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.6QCMYABX3D.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "standard", + "PurchaseOption": "All Upfront" + } + }, + "37DD9F3G2Q3TQYYE.7NE97W5U4E": { + "effectiveDate": "2026-10-23T22:37:32Z", + "offerTermCode": "7NE97W5U4E", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.7NE97W5U4E.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.2287200000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.7NE97W5U4E.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "convertible", + "PurchaseOption": "No Upfront" + } + }, + "37DD9F3G2Q3TQYYE.BPH4J8HBKS": { + "effectiveDate": "2026-10-23T22:37:30Z", + "offerTermCode": "BPH4J8HBKS", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.BPH4J8HBKS.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1402000000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.BPH4J8HBKS.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "standard", + "PurchaseOption": "No Upfront" + } + }, + "37DD9F3G2Q3TQYYE.CUZHX8X6JH": { + "effectiveDate": "2026-10-23T22:37:35Z", + "offerTermCode": "CUZHX8X6JH", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.CUZHX8X6JH.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "954" + }, + "rateCode": "37DD9F3G2Q3TQYYE.CUZHX8X6JH.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.CUZHX8X6JH.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1089100000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.CUZHX8X6JH.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "convertible", + "PurchaseOption": "Partial Upfront" + } + }, + "37DD9F3G2Q3TQYYE.HU7G6KETJZ": { + "effectiveDate": "2026-10-23T22:37:31Z", + "offerTermCode": "HU7G6KETJZ", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.HU7G6KETJZ.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "877" + }, + "rateCode": "37DD9F3G2Q3TQYYE.HU7G6KETJZ.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.HU7G6KETJZ.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1001100000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.HU7G6KETJZ.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "standard", + "PurchaseOption": "Partial Upfront" + } + }, + "37DD9F3G2Q3TQYYE.MZU6U2429S": { + "effectiveDate": "2026-10-23T22:37:33Z", + "offerTermCode": "MZU6U2429S", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.MZU6U2429S.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "3683" + }, + "rateCode": "37DD9F3G2Q3TQYYE.MZU6U2429S.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.MZU6U2429S.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.MZU6U2429S.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "convertible", + "PurchaseOption": "All Upfront" + } + }, + "37DD9F3G2Q3TQYYE.NQ3QZPMQV9": { + "effectiveDate": "2026-10-23T22:37:31Z", + "offerTermCode": "NQ3QZPMQV9", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.NQ3QZPMQV9.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "3207" + }, + "rateCode": "37DD9F3G2Q3TQYYE.NQ3QZPMQV9.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.NQ3QZPMQV9.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.NQ3QZPMQV9.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "standard", + "PurchaseOption": "All Upfront" + } + }, + "37DD9F3G2Q3TQYYE.R5XV2EPZQZ": { + "effectiveDate": "2026-10-23T22:37:36Z", + "offerTermCode": "R5XV2EPZQZ", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.R5XV2EPZQZ.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "1879" + }, + "rateCode": "37DD9F3G2Q3TQYYE.R5XV2EPZQZ.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.R5XV2EPZQZ.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0715100000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.R5XV2EPZQZ.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "convertible", + "PurchaseOption": "Partial Upfront" + } + }, + "37DD9F3G2Q3TQYYE.VJWZNREJX2": { + "effectiveDate": "2026-10-23T22:37:33Z", + "offerTermCode": "VJWZNREJX2", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.VJWZNREJX2.2TG2D8R56U": { + "appliesTo": [], + "description": "Upfront Fee", + "pricePerUnit": { + "USD": "1870" + }, + "rateCode": "37DD9F3G2Q3TQYYE.VJWZNREJX2.2TG2D8R56U", + "unit": "Quantity" + }, + "37DD9F3G2Q3TQYYE.VJWZNREJX2.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "USD 0.0 per Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.0000000000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.VJWZNREJX2.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "1yr", + "OfferingClass": "convertible", + "PurchaseOption": "All Upfront" + } + }, + "37DD9F3G2Q3TQYYE.Z2E3P23VKM": { + "effectiveDate": "2026-10-23T22:37:34Z", + "offerTermCode": "Z2E3P23VKM", + "priceDimensions": { + "37DD9F3G2Q3TQYYE.Z2E3P23VKM.6YS6EN2CT7": { + "appliesTo": [], + "beginRange": "0", + "description": "Linux/UNIX (Amazon VPC), c8g.2xlarge reserved instance applied", + "endRange": "Inf", + "pricePerUnit": { + "USD": "0.1544600000" + }, + "rateCode": "37DD9F3G2Q3TQYYE.Z2E3P23VKM.6YS6EN2CT7", + "unit": "Hrs" + } + }, + "sku": "37DD9F3G2Q3TQYYE", + "termAttributes": { + "LeaseContractLength": "3yr", + "OfferingClass": "convertible", + "PurchaseOption": "No Upfront" + } + } + } + }, + "version": "20261023221355" + } + ] + }, + "region": "us-east-1", + "source": "AWS Price List API, pricing:GetProducts, ServiceCode=AmazonEC2, endpoint us-east-1" +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/band_snr_by_condition.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/band_snr_by_condition.png new file mode 100644 index 0000000..6134b2f Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/band_snr_by_condition.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips.csv b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips.csv new file mode 100644 index 0000000..659d1a9 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips.csv @@ -0,0 +1,23 @@ +name,split,condition,class,expected,verdict,band_snr_db,time_error_s,enf_rmse_mhz,tool_calls,wall_s,reasons +camera_motion__s1061,test,camera_motion,authentic-with-mains-light,VERIFIED,VERIFIED,5.879417507896337,-0.13945651054382324,1.5155695285321376,10,467.6982674000319,READOUT_FROM_SIDECAR;MATCH_OK +clean__s1001,test,clean,authentic-with-mains-light,VERIFIED,VERIFIED,11.046374328443909,-0.0709981918334961,2.0492097433257968,10,266.87631060002604,READOUT_FROM_SIDECAR;MATCH_OK +clock_ppm__s1111,test,clock_ppm,authentic-with-mains-light,VERIFIED,VERIFIED,10.286133529247179,-0.44716787338256836,2.0658457846619354,10,393.11005280003883,READOUT_ESTIMATED;MATCH_OK +cols_axis__s1121,test,cols_axis,authentic-with-mains-light,VERIFIED,VERIFIED,10.643687843682102,-0.17409610748291016,1.9747113913257166,10,405.06803740002215,READOUT_ESTIMATED;MATCH_OK +cut_0p5s__s1161,test,cut_0p5s,edited,CONTRADICTED,VERIFIED,11.13580804150508,0.12726974487304688,,10,288.0382842000108,READOUT_FROM_SIDECAR;MATCH_OK;DROPPED_FRAMES_EXPLAINED +cut_1s__s1171,test,cut_1s,edited,CONTRADICTED,VERIFIED,10.87827310325058,-0.21680259704589844,,10,244.30187999998452,READOUT_FROM_SIDECAR;MATCH_OK;DROPPED_FRAMES_EXPLAINED +cut_2s__s1181,test,cut_2s,edited,CONTRADICTED,INCONCLUSIVE,11.25263142723854,,,10,253.7955472000176,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;DROPPED_FRAMES_EXPLAINED +daylight_partial__s1151,test,daylight_partial,authentic-with-mains-light,VERIFIED,VERIFIED,5.359920296453062,0.19695234298706055,1.156598449991461,10,404.4294480999815,READOUT_ESTIMATED;MATCH_OK +dropped_frames__s1051,test,dropped_frames,authentic-with-mains-light,VERIFIED,VERIFIED,11.075478884340239,-0.06804442405700684,1.5516420268825042,10,301.3147237999947,READOUT_FROM_SIDECAR;MATCH_OK;DROPPED_FRAMES_EXPLAINED +hdr__s1211,test,hdr,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,,,,3,3.6032313999603502,HDR_UNSUPPORTED +insert_other_time__s1191,test,insert_other_time,edited,CONTRADICTED,CONTRADICTED,11.267672783291756,,,11,690.4257742999471,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;EDIT_CANDIDATE;SEGMENT_OFFSET_INCONSISTENT;DROPPED_FRAMES_EXPLAINED +jitter__s1041,test,jitter,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,11.491706859947257,,4.821317785572609,10,518.580332499987,READOUT_ESTIMATED;NO_UNIQUE_MATCH;TIMESTAMP_JITTER_HIGH +messaging_compression__s1101,test,messaging_compression,authentic-with-mains-light,VERIFIED,VERIFIED,7.262699449708561,-0.7699370384216309,4.364257209105512,10,282.3577815000317,READOUT_FROM_SIDECAR;MATCH_OK;HIGH_COMPRESSION +moving_objects__s1071,test,moving_objects,authentic-with-mains-light,VERIFIED,VERIFIED,6.332840099755675,-0.18794536590576172,2.042635870845221,10,581.0312058000127,READOUT_FROM_SIDECAR;MATCH_OK +no_mains_light__s1141,test,no_mains_light,authentic-without-mains-light,INCONCLUSIVE,INCONCLUSIVE,-9.7117650434746,,277.78156740840694,13,261.4128824000363,SIGNAL_ABSENT;READOUT_FROM_SIDECAR;HIGH_COMPRESSION;USER_INPUT_REQUESTED +no_sidecar__s1011,test,no_sidecar,authentic-with-mains-light,VERIFIED,VERIFIED,11.072014009239794,-0.08924579620361328,1.9572711085148782,10,375.70339829998557,READOUT_ESTIMATED;MATCH_OK +noisy__s1081,test,noisy,authentic-with-mains-light,VERIFIED,VERIFIED,10.9536249423127,0.08622884750366211,1.8429938787114934,10,325.6868469999754,READOUT_FROM_SIDECAR;MATCH_OK +reorder__s1201,test,reorder,edited,CONTRADICTED,CONTRADICTED,11.025224775721618,,,11,411.1928624000284,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;EDIT_CANDIDATE;SEGMENT_OFFSET_INCONSISTENT;DROPPED_FRAMES_EXPLAINED +rotation_meta__s1131,test,rotation_meta,authentic-with-mains-light,VERIFIED,VERIFIED,11.136009409793497,0.01831197738647461,2.1388435508438954,10,410.1920305999811,READOUT_ESTIMATED;MATCH_OK +short_readout_long_expo__s1031,test,short_readout_long_expo,authentic-with-mains-light,VERIFIED,VERIFIED,8.992301133266661,-1342.181851387024,177.59755199915412,12,281.3143608000246,READOUT_FROM_SIDECAR;MATCH_OK +weak_flicker__s1021,test,weak_flicker,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,3.0620245660128695,,1.3043114814582657,11,248.29234510002425,SIGNAL_WEAK;READOUT_FROM_SIDECAR +web_compression__s1091,test,web_compression,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,10.436848522399043,,2.797532346813259,10,249.1422510999837,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;HIGH_COMPRESSION diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/camera_motion__s1061.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/camera_motion__s1061.json new file mode 100644 index 0000000..4404095 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/camera_motion__s1061.json @@ -0,0 +1,86 @@ +{ + "name": "camera_motion__s1061", + "condition": "camera_motion", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 467.6982674000319, + "truth_start_utc": 1768802313.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 3.3886, + "S2_linear": 14.7721, + "S3_readout": 0.0003, + "S4_motion": 147.8698, + "S5_segment": 0.0039, + "S7_rowsignal": 41.83, + "S6_patches": 13.3669, + "S8_phase": 10.9288, + "S10_match": 2.5148, + "S11_continuity": 0.005, + "S12_face": 0.0022, + "S14_overlay": 217.4651, + "S15_report": 14.7276 + }, + "band_snr_db": 5.879417507896337, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 5.879417507896337, + "axis_ambiguous": false, + "match": { + "rho1": 0.9813144753460411, + "rho2": 0.9052408716262708, + "margin": 0.07607360371977034, + "length_s": 35.0, + "best_offset_utc": 1768802312.8605435, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 20.19999999999999, + "z": 3.456261161449124, + "rad": 0.18902438929296483, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\camera_motion__s1061\\band_amplitude.png" + }, + "time_error_s": -0.13945651054382324, + "time_uncertainty_s": 1.317673128429738, + "zone": "SIM50", + "enf_rmse_mhz": 1.5155695285321376, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/clean__s1001.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/clean__s1001.json new file mode 100644 index 0000000..529bb89 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/clean__s1001.json @@ -0,0 +1,79 @@ +{ + "name": "clean__s1001", + "condition": "clean", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 266.87631060002604, + "truth_start_utc": 1768853186.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 1.6829, + "S2_linear": 20.8052, + "S3_readout": 0.0005, + "S4_motion": 78.9509, + "S5_segment": 0.0346, + "S7_rowsignal": 11.9911, + "S6_patches": 12.4232, + "S8_phase": 3.6284, + "S10_match": 1.5476, + "S11_continuity": 0.0029, + "S12_face": 0.001, + "S14_overlay": 112.8018, + "S15_report": 18.7453 + }, + "band_snr_db": 11.046374328443909, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.046374328443909, + "axis_ambiguous": false, + "match": { + "rho1": 0.9883607690571746, + "rho2": 0.9368937511344877, + "margin": 0.05146701792268693, + "length_s": 35.0, + "best_offset_utc": 1768853185.9290018, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clean__s1001\\band_amplitude.png" + }, + "time_error_s": -0.0709981918334961, + "time_uncertainty_s": 1.7049859311771116, + "zone": "SIM50", + "enf_rmse_mhz": 2.0492097433257968, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/clock_ppm__s1111.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/clock_ppm__s1111.json new file mode 100644 index 0000000..b474242 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/clock_ppm__s1111.json @@ -0,0 +1,79 @@ +{ + "name": "clock_ppm__s1111", + "condition": "clock_ppm", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 393.11005280003883, + "truth_start_utc": 1768665152.0, + "video_s": 35.967745666666666, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 1.7485, + "S2_linear": 11.6483, + "S7_rowsignal": 17.4714, + "S3_readout": 55.8364, + "S4_motion": 104.6588, + "S5_segment": 0.0141, + "S6_patches": 34.082, + "S8_phase": 24.6191, + "S10_match": 2.2946, + "S11_continuity": 0.0378, + "S12_face": 0.0003, + "S14_overlay": 138.5674, + "S15_report": 8.3466 + }, + "band_snr_db": 10.286133529247179, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 10.286133529247179, + "axis_ambiguous": false, + "match": { + "rho1": 0.9660194463969551, + "rho2": 0.8842580936330694, + "margin": 0.08176135276388574, + "length_s": 35.0, + "best_offset_utc": 1768665151.5528321, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\clock_ppm__s1111\\band_amplitude.png" + }, + "time_error_s": -0.44716787338256836, + "time_uncertainty_s": 1.4417520976282652, + "zone": "SIM50", + "enf_rmse_mhz": 2.0658457846619354, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cols_axis__s1121.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cols_axis__s1121.json new file mode 100644 index 0000000..97eb4b1 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cols_axis__s1121.json @@ -0,0 +1,79 @@ +{ + "name": "cols_axis__s1121", + "condition": "cols_axis", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 405.06803740002215, + "truth_start_utc": 1768776959.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 3.0391, + "S2_linear": 14.7765, + "S7_rowsignal": 21.0381, + "S3_readout": 54.2321, + "S4_motion": 93.8354, + "S5_segment": 0.0084, + "S6_patches": 37.8255, + "S8_phase": 42.6712, + "S10_match": 2.6032, + "S11_continuity": 0.0059, + "S12_face": 0.0026, + "S14_overlay": 131.1823, + "S15_report": 7.996 + }, + "band_snr_db": 10.643687843682102, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 10.643687843682102, + "axis_ambiguous": false, + "match": { + "rho1": 0.9938441436778859, + "rho2": 0.9690989475607766, + "margin": 0.024745196117109236, + "length_s": 35.0, + "best_offset_utc": 1768776958.825904, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cols_axis__s1121\\band_amplitude.png" + }, + "time_error_s": -0.17409610748291016, + "time_uncertainty_s": 3.5803337329122202, + "zone": "SIM50", + "enf_rmse_mhz": 1.9747113913257166, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_0p5s__s1161.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_0p5s__s1161.json new file mode 100644 index 0000000..d1267f8 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_0p5s__s1161.json @@ -0,0 +1,90 @@ +{ + "name": "cut_0p5s__s1161", + "condition": "cut_0p5s", + "split": "test", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 288.0382842000108, + "truth_start_utc": 1768669108.0, + "video_s": 35.46666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 3.1482, + "S2_linear": 14.1444, + "S3_readout": 0.0001, + "S4_motion": 120.4453, + "S5_segment": 0.0067, + "S7_rowsignal": 10.606, + "S6_patches": 13.354, + "S8_phase": 4.9136, + "S10_match": 0.9682, + "S11_continuity": 0.0065, + "S12_face": 0.0035, + "S14_overlay": 109.6364, + "S15_report": 10.3118 + }, + "band_snr_db": 11.13580804150508, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.13580804150508, + "axis_ambiguous": false, + "match": { + "rho1": 0.9510063413161136, + "rho2": 0.8968151023169435, + "margin": 0.05419123899917011, + "length_s": 35.0, + "best_offset_utc": 1768669108.1272697, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 15.833333332999985, + "z": 1.1636622124194753, + "rad": 0.037056994423871004, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_0p5s__s1161\\band_amplitude.png" + }, + "time_error_s": 0.12726974487304688, + "time_uncertainty_s": 1.5845221573704085, + "zone": "SIM50", + "edits_true_t_s": [ + 15.333333333333334 + ], + "edit_events_t_s": [], + "edit_localization_error_s": [], + "edit_detected": false, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_1s__s1171.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_1s__s1171.json new file mode 100644 index 0000000..02c6509 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_1s__s1171.json @@ -0,0 +1,90 @@ +{ + "name": "cut_1s__s1171", + "condition": "cut_1s", + "split": "test", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 244.30187999998452, + "truth_start_utc": 1768714751.0, + "video_s": 34.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 4.0571, + "S2_linear": 10.0426, + "S3_readout": 0.0, + "S4_motion": 98.436, + "S5_segment": 0.018, + "S7_rowsignal": 6.4452, + "S6_patches": 8.7867, + "S8_phase": 3.3991, + "S10_match": 2.2585, + "S11_continuity": 0.1142, + "S12_face": 0.0004, + "S14_overlay": 104.6514, + "S15_report": 5.7544 + }, + "band_snr_db": 10.87827310325058, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 10.87827310325058, + "axis_ambiguous": false, + "match": { + "rho1": 0.9872112389658195, + "rho2": 0.9217672873182987, + "margin": 0.06544395164752081, + "length_s": 35.0, + "best_offset_utc": 1768714750.7831974, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 18.099999999999994, + "z": 1.2865421530681356, + "rad": 0.16628954594616285, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_1s__s1171\\band_amplitude.png" + }, + "time_error_s": -0.21680259704589844, + "time_uncertainty_s": 2.0243103140523635, + "zone": "SIM50", + "edits_true_t_s": [ + 17.1 + ], + "edit_events_t_s": [], + "edit_localization_error_s": [], + "edit_detected": false, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_2s__s1181.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_2s__s1181.json new file mode 100644 index 0000000..e43a65e --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/cut_2s__s1181.json @@ -0,0 +1,90 @@ +{ + "name": "cut_2s__s1181", + "condition": "cut_2s", + "split": "test", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 253.7955472000176, + "truth_start_utc": 1768673828.0, + "video_s": 33.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 2.3022, + "S2_linear": 8.9613, + "S3_readout": 0.0001, + "S4_motion": 90.8541, + "S5_segment": 0.0151, + "S7_rowsignal": 20.862, + "S6_patches": 11.527, + "S8_phase": 5.8241, + "S10_match": 1.2705, + "S11_continuity": 0.0375, + "S12_face": 0.0067, + "S14_overlay": 103.7237, + "S15_report": 7.8701 + }, + "band_snr_db": 11.25263142723854, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.25263142723854, + "axis_ambiguous": false, + "match": { + "rho1": 0.9853791382556053, + "rho2": 0.9824422596404693, + "margin": 0.0029368786151360293, + "length_s": 35.0, + "best_offset_utc": 1768675137.2566679, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 14.699999999999989, + "z": 0.0, + "rad": NaN, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\cut_2s__s1181\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [ + 12.7 + ], + "edit_events_t_s": [], + "edit_localization_error_s": [], + "edit_detected": false, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/daylight_partial__s1151.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/daylight_partial__s1151.json new file mode 100644 index 0000000..dcde447 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/daylight_partial__s1151.json @@ -0,0 +1,79 @@ +{ + "name": "daylight_partial__s1151", + "condition": "daylight_partial", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 404.4294480999815, + "truth_start_utc": 1768790017.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 5.2226, + "S2_linear": 13.2051, + "S7_rowsignal": 21.7048, + "S3_readout": 51.5945, + "S4_motion": 136.6456, + "S5_segment": 0.0112, + "S6_patches": 38.5982, + "S8_phase": 20.5513, + "S10_match": 1.5049, + "S11_continuity": 0.0021, + "S12_face": 0.0011, + "S14_overlay": 114.8383, + "S15_report": 4.9549 + }, + "band_snr_db": 5.359920296453062, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 5.359920296453062, + "axis_ambiguous": false, + "match": { + "rho1": 0.9887324896701691, + "rho2": 0.9630979925359814, + "margin": 0.02563449713418775, + "length_s": 35.0, + "best_offset_utc": 1768790017.1969523, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\daylight_partial__s1151\\band_amplitude.png" + }, + "time_error_s": 0.19695234298706055, + "time_uncertainty_s": 2.444264265720046, + "zone": "SIM50", + "enf_rmse_mhz": 1.156598449991461, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/dropped_frames__s1051.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/dropped_frames__s1051.json new file mode 100644 index 0000000..cbe6d05 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/dropped_frames__s1051.json @@ -0,0 +1,93 @@ +{ + "name": "dropped_frames__s1051", + "condition": "dropped_frames", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 301.3147237999947, + "truth_start_utc": 1768961217.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 2.5226, + "S2_linear": 13.368, + "S3_readout": 0.0, + "S4_motion": 94.1288, + "S5_segment": 0.0004, + "S7_rowsignal": 6.6817, + "S6_patches": 10.3105, + "S8_phase": 3.4615, + "S10_match": 1.9067, + "S11_continuity": 0.0012, + "S12_face": 0.0002, + "S14_overlay": 154.4888, + "S15_report": 14.2271 + }, + "band_snr_db": 11.075478884340239, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.075478884340239, + "axis_ambiguous": false, + "match": { + "rho1": 0.9877114742676752, + "rho2": 0.9709218618376466, + "margin": 0.016789612430028633, + "length_s": 35.0, + "best_offset_utc": 1768961216.9319556, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 13.46666666599998, + "z": 0.08402301538726707, + "rad": 0.0024337906059979098, + "gap": true + }, + { + "t_s": 23.566666666000003, + "z": 0.2740796672221234, + "rad": 0.014101455397280027, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\dropped_frames__s1051\\band_amplitude.png" + }, + "time_error_s": -0.06804442405700684, + "time_uncertainty_s": 4.017209074601732, + "zone": "SIM50", + "enf_rmse_mhz": 1.5516420268825042, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/hdr__s1211.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/hdr__s1211.json new file mode 100644 index 0000000..413c0d5 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/hdr__s1211.json @@ -0,0 +1,50 @@ +{ + "name": "hdr__s1211", + "condition": "hdr", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 3.6032313999603502, + "truth_start_utc": 1768910751.0, + "video_s": 5.966666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "HDR_UNSUPPORTED" + ], + "stage_timings_s": { + "S1_ingest": 2.5979, + "S14_overlay": 0.0, + "S15_report": 0.8592 + }, + "band_snr_db": null, + "agent": { + "tool_calls": 3, + "extractions": 0, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HDR_UNSUPPORTED" + ] + }, + "artifacts": { + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\hdr__s1211\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\hdr__s1211\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\hdr__s1211\\result.json" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/insert_other_time__s1191.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/insert_other_time__s1191.json new file mode 100644 index 0000000..668eb75 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/insert_other_time__s1191.json @@ -0,0 +1,131 @@ +{ + "name": "insert_other_time__s1191", + "condition": "insert_other_time", + "split": "test", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 690.4257742999471, + "truth_start_utc": 1768607253.0, + "video_s": 101.96666666666667, + "verdict": "CONTRADICTED", + "lifecycle_state": "PENDING_REVIEW", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "EDIT_CANDIDATE", + "SEGMENT_OFFSET_INCONSISTENT", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 3.9018, + "S2_linear": 60.3193, + "S3_readout": 0.002, + "S4_motion": 191.268, + "S5_segment": 0.0237, + "S7_rowsignal": 52.4332, + "S6_patches": 57.4829, + "S8_phase": 51.712, + "S10_match": 1.0469, + "S11_continuity": 0.0094, + "S12_face": 0.0066, + "S14_overlay": 266.6711, + "S15_report": 4.569 + }, + "band_snr_db": 11.267672783291756, + "agent": { + "tool_calls": 11, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": true + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.267672783291756, + "axis_ambiguous": false, + "match": { + "rho1": 0.5715270554539253, + "rho2": 0.5405386905857436, + "margin": 0.030988364868181795, + "length_s": 69.0, + "best_offset_utc": 1768608361.2044678, + "coverage": true, + "segment_stats": [ + { + "rho1": 0.8723767277299095, + "offset": 1768609409.613302, + "margin": 0.027108661835454573 + }, + { + "rho1": 0.9588452507701034, + "offset": 1768607253.188616, + "margin": 0.18024366977406114 + } + ] + }, + "boundaries": [ + { + "t_s": -1469.9666666660003, + "z": 4.577585314144895, + "rad": 3.0994176614294835, + "gap": false + }, + { + "t_s": -1462.8333333330002, + "z": 3.2923582934702504, + "rad": 0.15448400584456667, + "gap": false + }, + { + "t_s": -1460.433333333, + "z": 3.7380279991364653, + "rad": 0.15759704941425046, + "gap": false + }, + { + "t_s": -1448.0666666660002, + "z": 47.51741686616008, + "rad": 1.2287871410496978, + "gap": false + }, + { + "t_s": 30.0, + "z": 0.0, + "rad": NaN, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\insert_other_time__s1191\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [ + 30.0 + ], + "edit_events_t_s": [ + -1448.0666666660002 + ], + "edit_localization_error_s": [ + 1478.0666666660002 + ], + "edit_detected": true, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/jitter__s1041.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/jitter__s1041.json new file mode 100644 index 0000000..663b868 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/jitter__s1041.json @@ -0,0 +1,88 @@ +{ + "name": "jitter__s1041", + "condition": "jitter", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 518.580332499987, + "truth_start_utc": 1768640847.0, + "video_s": 35.968337628764, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH", + "TIMESTAMP_JITTER_HIGH" + ], + "stage_timings_s": { + "S1_ingest": 3.209, + "S2_linear": 14.8541, + "S7_rowsignal": 14.2558, + "S3_readout": 49.2767, + "S4_motion": 101.4251, + "S5_segment": 0.0034, + "S6_patches": 53.6865, + "S8_phase": 37.1649, + "S10_match": 3.0901, + "S11_continuity": 0.0097, + "S12_face": 0.0065, + "S14_overlay": 231.2034, + "S15_report": 14.6652 + }, + "band_snr_db": 11.491706859947257, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED", + "TIMESTAMP_JITTER_HIGH" + ], + "band_snr_db": 11.491706859947257, + "axis_ambiguous": false, + "match": { + "rho1": 0.5227475601923997, + "rho2": 0.509392863886956, + "margin": 0.013354696305443614, + "length_s": 35.0, + "best_offset_utc": 1768640846.299998, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 7.3308888888888895, + "z": 3.3262576033692257, + "rad": 0.9528493230649646, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\jitter__s1041\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 4.821317785572609, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/messaging_compression__s1101.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/messaging_compression__s1101.json new file mode 100644 index 0000000..4c1c18b --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/messaging_compression__s1101.json @@ -0,0 +1,81 @@ +{ + "name": "messaging_compression__s1101", + "condition": "messaging_compression", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 282.3577815000317, + "truth_start_utc": 1768517713.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK", + "HIGH_COMPRESSION" + ], + "stage_timings_s": { + "S1_ingest": 4.6406, + "S2_linear": 16.3252, + "S3_readout": 0.0, + "S4_motion": 101.8548, + "S5_segment": 0.0065, + "S7_rowsignal": 10.5425, + "S6_patches": 11.3859, + "S8_phase": 6.7268, + "S10_match": 1.3572, + "S11_continuity": 0.0019, + "S12_face": 0.0039, + "S14_overlay": 124.3304, + "S15_report": 4.4893 + }, + "band_snr_db": 7.262699449708561, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HIGH_COMPRESSION", + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 7.262699449708561, + "axis_ambiguous": false, + "match": { + "rho1": 0.985352779669255, + "rho2": 0.9583864396836863, + "margin": 0.026966339985568744, + "length_s": 35.0, + "best_offset_utc": 1768517712.230063, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\messaging_compression__s1101\\band_amplitude.png" + }, + "time_error_s": -0.7699370384216309, + "time_uncertainty_s": 3.003331747071876, + "zone": "SIM50", + "enf_rmse_mhz": 4.364257209105512, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/moving_objects__s1071.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/moving_objects__s1071.json new file mode 100644 index 0000000..be01cf1 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/moving_objects__s1071.json @@ -0,0 +1,79 @@ +{ + "name": "moving_objects__s1071", + "condition": "moving_objects", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 581.0312058000127, + "truth_start_utc": 1768840336.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 3.4499, + "S2_linear": 12.7832, + "S3_readout": 0.0, + "S4_motion": 209.9318, + "S5_segment": 0.0069, + "S7_rowsignal": 228.7964, + "S6_patches": 8.119, + "S8_phase": 4.2598, + "S10_match": 1.1953, + "S11_continuity": 0.0023, + "S12_face": 0.001, + "S14_overlay": 104.703, + "S15_report": 7.2312 + }, + "band_snr_db": 6.332840099755675, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 6.332840099755675, + "axis_ambiguous": false, + "match": { + "rho1": 0.9924098184755691, + "rho2": 0.9667965730880506, + "margin": 0.025613245387518524, + "length_s": 35.0, + "best_offset_utc": 1768840335.8120546, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\moving_objects__s1071\\band_amplitude.png" + }, + "time_error_s": -0.18794536590576172, + "time_uncertainty_s": 3.0543637319005414, + "zone": "SIM50", + "enf_rmse_mhz": 2.042635870845221, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/no_mains_light__s1141.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/no_mains_light__s1141.json new file mode 100644 index 0000000..aa51cb0 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/no_mains_light__s1141.json @@ -0,0 +1,69 @@ +{ + "name": "no_mains_light__s1141", + "condition": "no_mains_light", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-without-mains-light", + "expected_verdict": "INCONCLUSIVE", + "planner": "fallback", + "wall_s": 261.4128824000363, + "truth_start_utc": 1768668437.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_FROM_SIDECAR", + "HIGH_COMPRESSION", + "USER_INPUT_REQUESTED" + ], + "stage_timings_s": { + "S1_ingest": 1.6564, + "S2_linear": 8.0367, + "S3_readout": 0.0004, + "S4_motion": 104.1638, + "S5_segment": 0.0075, + "S7_rowsignal": 22.4415, + "S6_patches": 22.7202, + "S8_phase": 31.5785, + "S14_overlay": 64.6011, + "S15_report": 5.2421 + }, + "band_snr_db": -9.7117650434746, + "agent": { + "tool_calls": 13, + "extractions": 5, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 5, + "budget_exhausted": false, + "user_input_requested": [ + "original_file" + ], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HIGH_COMPRESSION", + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": -9.7117650434746, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_mains_light__s1141\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_mains_light__s1141\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_mains_light__s1141\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_mains_light__s1141\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_mains_light__s1141\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_mains_light__s1141\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 277.78156740840694, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/no_sidecar__s1011.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/no_sidecar__s1011.json new file mode 100644 index 0000000..45e0fb7 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/no_sidecar__s1011.json @@ -0,0 +1,86 @@ +{ + "name": "no_sidecar__s1011", + "condition": "no_sidecar", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 375.70339829998557, + "truth_start_utc": 1768770391.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 2.3247, + "S2_linear": 18.4303, + "S7_rowsignal": 24.8537, + "S3_readout": 45.0069, + "S4_motion": 87.4923, + "S5_segment": 0.008, + "S6_patches": 31.5114, + "S8_phase": 33.263, + "S10_match": 3.1411, + "S11_continuity": 0.0043, + "S12_face": 0.0024, + "S14_overlay": 118.105, + "S15_report": 8.7629 + }, + "band_snr_db": 11.072014009239794, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 11.072014009239794, + "axis_ambiguous": false, + "match": { + "rho1": 0.9989618909572525, + "rho2": 0.982623069188922, + "margin": 0.01633882176833057, + "length_s": 35.0, + "best_offset_utc": 1768770390.9107542, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 34.0, + "z": 3.0384841282282236, + "rad": 0.06740606139029381, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\no_sidecar__s1011\\band_amplitude.png" + }, + "time_error_s": -0.08924579620361328, + "time_uncertainty_s": 4.097728786216274, + "zone": "SIM50", + "enf_rmse_mhz": 1.9572711085148782, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/noisy__s1081.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/noisy__s1081.json new file mode 100644 index 0000000..b2d0171 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/noisy__s1081.json @@ -0,0 +1,79 @@ +{ + "name": "noisy__s1081", + "condition": "noisy", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 325.6868469999754, + "truth_start_utc": 1768475563.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 8.0644, + "S2_linear": 24.0615, + "S3_readout": 0.0, + "S4_motion": 181.7458, + "S5_segment": 0.0002, + "S7_rowsignal": 7.5295, + "S6_patches": 14.7838, + "S8_phase": 4.1332, + "S10_match": 0.9106, + "S11_continuity": 0.001, + "S12_face": 0.0003, + "S14_overlay": 78.7234, + "S15_report": 5.2614 + }, + "band_snr_db": 10.9536249423127, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 10.9536249423127, + "axis_ambiguous": false, + "match": { + "rho1": 0.9957704488339157, + "rho2": 0.9379945581204803, + "margin": 0.057775890713435474, + "length_s": 35.0, + "best_offset_utc": 1768475563.0862288, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\noisy__s1081\\band_amplitude.png" + }, + "time_error_s": 0.08622884750366211, + "time_uncertainty_s": 1.8453144237073758, + "zone": "SIM50", + "enf_rmse_mhz": 1.8429938787114934, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/reorder__s1201.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/reorder__s1201.json new file mode 100644 index 0000000..5e214d0 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/reorder__s1201.json @@ -0,0 +1,119 @@ +{ + "name": "reorder__s1201", + "condition": "reorder", + "split": "test", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 411.1928624000284, + "truth_start_utc": 1768575283.0, + "video_s": 69.96666666666667, + "verdict": "CONTRADICTED", + "lifecycle_state": "PENDING_REVIEW", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "EDIT_CANDIDATE", + "SEGMENT_OFFSET_INCONSISTENT", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 2.8501, + "S2_linear": 38.2312, + "S3_readout": 0.0006, + "S4_motion": 111.556, + "S5_segment": 0.0089, + "S7_rowsignal": 11.217, + "S6_patches": 25.77, + "S8_phase": 6.4723, + "S10_match": 0.8817, + "S11_continuity": 0.0159, + "S12_face": 0.0035, + "S14_overlay": 207.3359, + "S15_report": 6.4946 + }, + "band_snr_db": 11.025224775721618, + "agent": { + "tool_calls": 11, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": true + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.025224775721618, + "axis_ambiguous": false, + "match": { + "rho1": 0.6547266275516092, + "rho2": 0.6287717961444808, + "margin": 0.025954831407128398, + "length_s": 69.0, + "best_offset_utc": 1768574642.1236339, + "coverage": true, + "segment_stats": [ + { + "rho1": 0.9907400893610994, + "offset": 1768575282.9808614, + "margin": 0.030137925000769505 + }, + { + "rho1": 0.8708849069823121, + "offset": 1768577636.9263852, + "margin": 0.012180235106511894 + } + ] + }, + "boundaries": [ + { + "t_s": 2.566666665999989, + "z": 26.41917969999762, + "rad": 1.0417735851283663, + "gap": false + }, + { + "t_s": 36.0, + "z": 0.0, + "rad": NaN, + "gap": true + }, + { + "t_s": 33.033333333, + "z": 7.428942806182527, + "rad": 0.8331384875328105, + "gap": false + }, + { + "t_s": 66.0, + "z": 0.0, + "rad": NaN, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\reorder__s1201\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [], + "edit_events_t_s": [ + 2.566666665999989 + ], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/rotation_meta__s1131.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/rotation_meta__s1131.json new file mode 100644 index 0000000..da1bd65 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/rotation_meta__s1131.json @@ -0,0 +1,79 @@ +{ + "name": "rotation_meta__s1131", + "condition": "rotation_meta", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 410.1920305999811, + "truth_start_utc": 1768914055.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 1.5695, + "S2_linear": 10.3896, + "S7_rowsignal": 30.3018, + "S3_readout": 48.816, + "S4_motion": 114.3187, + "S5_segment": 0.0643, + "S6_patches": 48.6354, + "S8_phase": 31.1033, + "S10_match": 2.9102, + "S11_continuity": 0.0015, + "S12_face": 0.0003, + "S14_overlay": 123.0315, + "S15_report": 5.2462 + }, + "band_snr_db": 11.136009409793497, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 11.136009409793497, + "axis_ambiguous": false, + "match": { + "rho1": 0.9920379461350217, + "rho2": 0.951994458863877, + "margin": 0.040043487271144707, + "length_s": 35.0, + "best_offset_utc": 1768914055.018312, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\rotation_meta__s1131\\band_amplitude.png" + }, + "time_error_s": 0.01831197738647461, + "time_uncertainty_s": 2.0061676853122905, + "zone": "SIM50", + "enf_rmse_mhz": 2.1388435508438954, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/short_readout_long_expo__s1031.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/short_readout_long_expo__s1031.json new file mode 100644 index 0000000..95e09bd --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/short_readout_long_expo__s1031.json @@ -0,0 +1,104 @@ +{ + "name": "short_readout_long_expo__s1031", + "condition": "short_readout_long_expo", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 281.3143608000246, + "truth_start_utc": 1768483869.0, + "video_s": 35.96666666666667, + "verdict": "VERIFIED", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "MATCH_OK" + ], + "stage_timings_s": { + "S1_ingest": 2.5302, + "S2_linear": 14.5234, + "S3_readout": 0.0001, + "S4_motion": 75.668, + "S5_segment": 0.0047, + "S7_rowsignal": 7.2804, + "S6_patches": 23.6138, + "S8_phase": 7.5748, + "S10_match": 0.8761, + "S11_continuity": 0.0029, + "S12_face": 0.0021, + "S14_overlay": 123.7565, + "S15_report": 16.5344 + }, + "band_snr_db": 8.992301133266661, + "agent": { + "tool_calls": 12, + "extractions": 2, + "first_extraction_weak": true, + "recovered_signal": true, + "unnecessary_calls": 0, + "policy_interventions": 2, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 8.992301133266661, + "axis_ambiguous": false, + "match": { + "rho1": 0.8156184371036445, + "rho2": 0.7993662869919208, + "margin": 0.01625215011172365, + "length_s": 35.0, + "best_offset_utc": 1768482526.8181486, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 13.833333332999985, + "z": 3.6433180439258797, + "rad": 2.995263306784106, + "gap": false + }, + { + "t_s": 15.333333332999985, + "z": 3.5003729726334596, + "rad": 2.8907209978392565, + "gap": false + }, + { + "t_s": 18.333333332999985, + "z": 3.4187342301751413, + "rad": 2.927813517126612, + "gap": false + }, + { + "t_s": 21.400000000000006, + "z": 3.4460689725833706, + "rad": 2.9281735527414767, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1031\\band_amplitude.png" + }, + "time_error_s": -1342.181851387024, + "time_uncertainty_s": 1.7236201057677338, + "zone": "SIM50", + "enf_rmse_mhz": 177.59755199915412, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/weak_flicker__s1021.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/weak_flicker__s1021.json new file mode 100644 index 0000000..4039f82 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/weak_flicker__s1021.json @@ -0,0 +1,64 @@ +{ + "name": "weak_flicker__s1021", + "condition": "weak_flicker", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 248.29234510002425, + "truth_start_utc": 1768605301.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_WEAK", + "READOUT_FROM_SIDECAR" + ], + "stage_timings_s": { + "S1_ingest": 2.2175, + "S2_linear": 15.0539, + "S3_readout": 0.0001, + "S4_motion": 74.6148, + "S5_segment": 0.0063, + "S7_rowsignal": 6.9667, + "S6_patches": 21.294, + "S8_phase": 15.9272, + "S14_overlay": 93.1577, + "S15_report": 7.0019 + }, + "band_snr_db": 3.0620245660128695, + "agent": { + "tool_calls": 11, + "extractions": 4, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 4, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 3.0620245660128695, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\weak_flicker__s1021\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\weak_flicker__s1021\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\weak_flicker__s1021\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\weak_flicker__s1021\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\weak_flicker__s1021\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\weak_flicker__s1021\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.3043114814582657, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/web_compression__s1091.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/web_compression__s1091.json new file mode 100644 index 0000000..2549c2d --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/clips/web_compression__s1091.json @@ -0,0 +1,106 @@ +{ + "name": "web_compression__s1091", + "condition": "web_compression", + "split": "test", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 249.1422510999837, + "truth_start_utc": 1768968229.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "HIGH_COMPRESSION" + ], + "stage_timings_s": { + "S1_ingest": 3.6057, + "S2_linear": 20.4169, + "S3_readout": 0.0001, + "S4_motion": 80.8941, + "S5_segment": 0.0018, + "S7_rowsignal": 5.8506, + "S6_patches": 11.5314, + "S8_phase": 4.3181, + "S10_match": 1.4513, + "S11_continuity": 0.0025, + "S12_face": 0.0006, + "S14_overlay": 113.2382, + "S15_report": 7.5889 + }, + "band_snr_db": 10.436848522399043, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 1, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HIGH_COMPRESSION", + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 10.436848522399043, + "axis_ambiguous": false, + "match": { + "rho1": 0.9797527221983637, + "rho2": 0.9746605161618144, + "margin": 0.005092206036549363, + "length_s": 35.0, + "best_offset_utc": 1768968228.68571, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 4.133333332999996, + "z": 3.81615415598488, + "rad": 0.1343371458471161, + "gap": false + }, + { + "t_s": 8.833333332999985, + "z": 3.3201142971648854, + "rad": 0.10027733439361919, + "gap": false + }, + { + "t_s": 12.46666666599998, + "z": 5.065314934538549, + "rad": 0.11983863931381, + "gap": false + }, + { + "t_s": 17.166666665999998, + "z": 3.579123943768118, + "rad": 0.11397040455228336, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27-test\\synthetic-v1-fallback\\work\\web_compression__s1091\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 2.797532346813259, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1161__enf_track.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1161__enf_track.png new file mode 100644 index 0000000..8a3ae69 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1161__enf_track.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1161__phase_residual.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1161__phase_residual.png new file mode 100644 index 0000000..f99ce15 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1161__phase_residual.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_1s__s1171__enf_track.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_1s__s1171__enf_track.png new file mode 100644 index 0000000..0f2a5b1 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_1s__s1171__enf_track.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_1s__s1171__phase_residual.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_1s__s1171__phase_residual.png new file mode 100644 index 0000000..c70dc60 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_1s__s1171__phase_residual.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_2s__s1181__enf_track.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_2s__s1181__enf_track.png new file mode 100644 index 0000000..5f28c87 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_2s__s1181__enf_track.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_2s__s1181__phase_residual.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_2s__s1181__phase_residual.png new file mode 100644 index 0000000..7340957 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/cut_2s__s1181__phase_residual.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/jitter__s1041__enf_track.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/jitter__s1041__enf_track.png new file mode 100644 index 0000000..ffd3988 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/jitter__s1041__enf_track.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/jitter__s1041__phase_residual.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/jitter__s1041__phase_residual.png new file mode 100644 index 0000000..358785a Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/jitter__s1041__phase_residual.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/weak_flicker__s1021__enf_track.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/weak_flicker__s1021__enf_track.png new file mode 100644 index 0000000..28141d5 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/weak_flicker__s1021__enf_track.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/web_compression__s1091__enf_track.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/web_compression__s1091__enf_track.png new file mode 100644 index 0000000..509d660 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/web_compression__s1091__enf_track.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/web_compression__s1091__phase_residual.png b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/web_compression__s1091__phase_residual.png new file mode 100644 index 0000000..bca0ac7 Binary files /dev/null and b/results/eval/2026-10-27-test/synthetic-v1-fallback/failure_gallery/web_compression__s1091__phase_residual.png differ diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/run_meta.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/run_meta.json new file mode 100644 index 0000000..309cb19 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/run_meta.json @@ -0,0 +1,9 @@ +{ + "suite": "synthetic-v1", + "data": "../../data/synthetic/v1", + "planner": "fallback", + "split": "test", + "date": "2026-10-27-test", + "label": "SYNTHETIC", + "thresholds_hash": "0161b96f77d3e925" +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/summary.json b/results/eval/2026-10-27-test/synthetic-v1-fallback/summary.json new file mode 100644 index 0000000..a5127cd --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/summary.json @@ -0,0 +1,1109 @@ +{ + "label": "SYNTHETIC", + "meta": { + "suite": "synthetic-v1", + "data": "../../data/synthetic/v1", + "planner": "fallback", + "split": "test", + "date": "2026-10-27-test", + "label": "SYNTHETIC", + "thresholds_hash": "0161b96f77d3e925" + }, + "test": { + "n_clips": 22, + "confusion": { + "authentic-with-mains-light": { + "VERIFIED": 12, + "CONTRADICTED": 0, + "INCONCLUSIVE": 4, + "None": 0 + }, + "authentic-without-mains-light": { + "VERIFIED": 0, + "CONTRADICTED": 0, + "INCONCLUSIVE": 1, + "None": 0 + }, + "edited": { + "VERIFIED": 2, + "CONTRADICTED": 2, + "INCONCLUSIVE": 1, + "None": 0 + }, + "synthetic": { + "VERIFIED": 0, + "CONTRADICTED": 0, + "INCONCLUSIVE": 0, + "None": 0 + } + }, + "false_contradicted_rate": { + "k": 0, + "n": 17, + "rate": 0.0, + "ci95": [ + 0.0, + 0.18432366037156456 + ] + }, + "verified_coverage_mains": { + "k": 12, + "n": 16, + "rate": 0.75, + "ci95": [ + 0.5050123107060135, + 0.8981809801576265 + ] + }, + "per_condition": { + "camera_motion": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "clean": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "clock_ppm": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "cols_axis": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "cut_0p5s": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "cut_1s": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "cut_2s": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "daylight_partial": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "dropped_frames": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "hdr": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "insert_other_time": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "jitter": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "messaging_compression": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "moving_objects": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "no_mains_light": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "no_sidecar": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "noisy": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "reorder": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "rotation_meta": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "short_readout_long_expo": { + "n": 1, + "verified": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "weak_flicker": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "web_compression": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + } + }, + "time_error_verified_s": { + "n": 14, + "mean": 96.05530772890363, + "median": 0.1567763090133667, + "p95": 470.26410706043197, + "max": 1342.181851387024 + }, + "enf_rmse_mhz": { + "n": 16, + "mean": 30.435116222759106, + "median": 2.0459228070855087, + "p95": 202.64355585146734, + "max": 277.78156740840694 + }, + "edit_detection": { + "k": 2, + "n": 5, + "rate": 0.4, + "ci95": [ + 0.1176182311592533, + 0.769280067791163 + ] + }, + "edit_localization_error_s": { + "n": 1, + "mean": 1478.0666666660002, + "median": 1478.0666666660002, + "p95": 1478.0666666660002, + "max": 1478.0666666660002 + }, + "dropped_frame_false_alarm": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "agent": { + "task_success": { + "k": 15, + "n": 22, + "rate": 0.6818181818181818, + "ci95": [ + 0.47318222782839336, + 0.8363961264530752 + ] + }, + "recovery_rate": { + "k": 1, + "n": 3, + "rate": 0.3333333333333333, + "ci95": [ + 0.0614903152761605, + 0.7923450448735121 + ] + }, + "tool_calls_per_job": { + "n": 22, + "mean": 10.045454545454545, + "median": 10.0, + "p95": 11.95, + "max": 13.0 + }, + "unnecessary_call_rate": { + "k": 0, + "n": 221, + "rate": 0.0, + "ci95": [ + 1.734723475976807e-18, + 0.01708580618533225 + ] + }, + "human_review_precision": { + "k": 2, + "n": 2, + "rate": 1.0, + "ci95": [ + 0.34237195288961925, + 1.0 + ] + }, + "budget_exhaustion_rate": { + "k": 0, + "n": 22, + "rate": 0.0, + "ci95": [ + 1.3877787807814457e-17, + 0.14865952572596125 + ] + }, + "user_input_requests": { + "original_file": 1 + } + }, + "runtime_per_stage_s": { + "S10_match": { + "n": 19, + "mean": 1.7752368421052633, + "median": 1.5049, + "p95": 3.0951999999999997, + "max": 3.1411 + }, + "S11_continuity": { + "n": 19, + "mean": 0.013921052631578949, + "median": 0.0043, + "p95": 0.045439999999999835, + "max": 0.1142 + }, + "S12_face": { + "n": 19, + "mean": 0.002378947368421053, + "median": 0.0021, + "p95": 0.0066099999999999996, + "max": 0.0067 + }, + "S14_overlay": { + "n": 22, + "mean": 128.91874545454547, + "median": 116.47165000000001, + "p95": 230.516485, + "max": 266.6711 + }, + "S15_report": { + "n": 22, + "mean": 8.49455, + "median": 7.41005, + "p95": 16.44406, + "max": 18.7453 + }, + "S1_ingest": { + "n": 22, + "mean": 3.1695227272727267, + "median": 2.9446, + "p95": 5.193499999999999, + "max": 8.0644 + }, + "S2_linear": { + "n": 21, + "mean": 17.86422857142857, + "median": 14.7721, + "p95": 38.2312, + "max": 60.3193 + }, + "S3_readout": { + "n": 21, + "mean": 14.512709523809523, + "median": 0.0003, + "p95": 54.2321, + "max": 55.8364 + }, + "S4_motion": { + "n": 21, + "mean": 114.32180476190474, + "median": 101.8548, + "p95": 191.268, + "max": 209.9318 + }, + "S5_segment": { + "n": 21, + "mean": 0.012123809523809526, + "median": 0.0075, + "p95": 0.0346, + "max": 0.0643 + }, + "S6_patches": { + "n": 21, + "mean": 24.324204761904763, + "median": 21.294, + "p95": 53.6865, + "max": 57.4829 + }, + "S7_rowsignal": { + "n": 21, + "mean": 27.67139999999999, + "median": 14.2558, + "p95": 52.4332, + "max": 228.7964 + }, + "S8_phase": { + "n": 21, + "mean": 16.868142857142853, + "median": 7.5748, + "p95": 42.6712, + "max": 51.712 + } + }, + "errors": [] + } +} \ No newline at end of file diff --git a/results/eval/2026-10-27-test/synthetic-v1-fallback/summary.md b/results/eval/2026-10-27-test/synthetic-v1-fallback/summary.md new file mode 100644 index 0000000..7256455 --- /dev/null +++ b/results/eval/2026-10-27-test/synthetic-v1-fallback/summary.md @@ -0,0 +1,106 @@ +# Evaluation summary — SYNTHETIC + +Run: `synthetic-v1-fallback`, date 2026-10-27-test, planner `fallback`, thresholds hash `0161b96f77d3e925`. + +**All results in this file are SYNTHETIC (simulator output). They are not real-world accuracy.** + +## test split (SYNTHETIC) + +| Metric | Value (95% CI) | +|---|---| +| False-CONTRADICTED rate on authentic clips | 0.0% [0.0–18.4] (k=0, n=17) | +| VERIFIED coverage, mains-lit clips | 75.0% [50.5–89.8] (k=12, n=16) | +| Edit detection rate | 40.0% [11.8–76.9] (k=2, n=5) | +| Dropped-frame false alarms | 0.0% [0.0–79.3] (k=0, n=1) | +| Agent task success | 68.2% [47.3–83.6] (k=15, n=22) | +| Agent recovery rate | 33.3% [6.1–79.2] (k=1, n=3) | +| Human-review precision | 100.0% [34.2–100.0] (k=2, n=2) | +| Budget exhaustion rate | 0.0% [0.0–14.9] (k=0, n=22) | + +### Confusion matrix (rows: ground-truth class; columns: verdict) + +| class | VERIFIED | CONTRADICTED | INCONCLUSIVE | none | +|---|---|---|---|---| +| authentic-with-mains-light | 12 | 0 | 4 | 0 | +| authentic-without-mains-light | 0 | 0 | 1 | 0 | +| edited | 2 | 2 | 1 | 0 | +| synthetic | 0 | 0 | 0 | 0 | + +### Per condition + +| condition | n | VERIFIED | INCONCLUSIVE | CONTRADICTED | success | +|---|---|---|---|---|---| +| camera_motion | 1 | 1 | 0 | 0 | 1 | +| clean | 1 | 1 | 0 | 0 | 1 | +| clock_ppm | 1 | 1 | 0 | 0 | 1 | +| cols_axis | 1 | 1 | 0 | 0 | 1 | +| cut_0p5s | 1 | 1 | 0 | 0 | 0 | +| cut_1s | 1 | 1 | 0 | 0 | 0 | +| cut_2s | 1 | 0 | 1 | 0 | 0 | +| daylight_partial | 1 | 1 | 0 | 0 | 1 | +| dropped_frames | 1 | 1 | 0 | 0 | 1 | +| hdr | 1 | 0 | 1 | 0 | 0 | +| insert_other_time | 1 | 0 | 0 | 1 | 1 | +| jitter | 1 | 0 | 1 | 0 | 0 | +| messaging_compression | 1 | 1 | 0 | 0 | 1 | +| moving_objects | 1 | 1 | 0 | 0 | 1 | +| no_mains_light | 1 | 0 | 1 | 0 | 1 | +| no_sidecar | 1 | 1 | 0 | 0 | 1 | +| noisy | 1 | 1 | 0 | 0 | 1 | +| reorder | 1 | 0 | 0 | 1 | 1 | +| rotation_meta | 1 | 1 | 0 | 0 | 1 | +| short_readout_long_expo | 1 | 1 | 0 | 0 | 1 | +| weak_flicker | 1 | 0 | 1 | 0 | 0 | +| web_compression | 1 | 0 | 1 | 0 | 0 | + +Time error of VERIFIED clips (s): `{"n": 14, "mean": 96.05530772890363, "median": 0.1567763090133667, "p95": 470.26410706043197, "max": 1342.181851387024}` +ENF track RMSE vs ground truth (mHz): `{"n": 16, "mean": 30.435116222759106, "median": 2.0459228070855087, "p95": 202.64355585146734, "max": 277.78156740840694}` +Edit localization error (s): `{"n": 1, "mean": 1478.0666666660002, "median": 1478.0666666660002, "p95": 1478.0666666660002, "max": 1478.0666666660002}` +Tool calls per job: `{"n": 22, "mean": 10.045454545454545, "median": 10.0, "p95": 11.95, "max": 13.0}` + +## Failure-case gallery (SYNTHETIC, 7 cases) + +### cut_0p5s__s1161 +- Condition: cut_0p5s; expected CONTRADICTED, got VERIFIED. +- Explanation: The edit did not change the flicker phase or the matched time enough to pass the thresholds. Cuts whose length is close to a whole number of flicker periods change the phase only a little. +- overlay_mp4: `cut_0p5s__s1161__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [cut_0p5s__s1161__phase_residual.png](failure_gallery/cut_0p5s__s1161__phase_residual.png) +- plot_enf_track: [cut_0p5s__s1161__enf_track.png](failure_gallery/cut_0p5s__s1161__enf_track.png) + +### cut_1s__s1171 +- Condition: cut_1s; expected CONTRADICTED, got VERIFIED. +- Explanation: The edit did not change the flicker phase or the matched time enough to pass the thresholds. Cuts whose length is close to a whole number of flicker periods change the phase only a little. +- overlay_mp4: `cut_1s__s1171__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [cut_1s__s1171__phase_residual.png](failure_gallery/cut_1s__s1171__phase_residual.png) +- plot_enf_track: [cut_1s__s1171__enf_track.png](failure_gallery/cut_1s__s1171__enf_track.png) + +### cut_2s__s1181 +- Condition: cut_2s; expected CONTRADICTED, got INCONCLUSIVE. +- Explanation: The edit did not change the flicker phase or the matched time enough to pass the thresholds. Cuts whose length is close to a whole number of flicker periods change the phase only a little. +- overlay_mp4: `cut_2s__s1181__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [cut_2s__s1181__phase_residual.png](failure_gallery/cut_2s__s1181__phase_residual.png) +- plot_enf_track: [cut_2s__s1181__enf_track.png](failure_gallery/cut_2s__s1181__enf_track.png) + +### hdr__s1211 +- Condition: hdr; expected VERIFIED, got INCONCLUSIVE. +- Explanation: Reasons: ['HDR_UNSUPPORTED'] + +### jitter__s1041 +- Condition: jitter; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `jitter__s1041__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [jitter__s1041__phase_residual.png](failure_gallery/jitter__s1041__phase_residual.png) +- plot_enf_track: [jitter__s1041__enf_track.png](failure_gallery/jitter__s1041__enf_track.png) + +### weak_flicker__s1021 +- Condition: weak_flicker; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The flicker signal was too weak in this condition. +- overlay_mp4: `weak_flicker__s1021__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_enf_track: [weak_flicker__s1021__enf_track.png](failure_gallery/weak_flicker__s1021__enf_track.png) + +### web_compression__s1091 +- Condition: web_compression; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `web_compression__s1091__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [web_compression__s1091__phase_residual.png](failure_gallery/web_compression__s1091__phase_residual.png) +- plot_enf_track: [web_compression__s1091__enf_track.png](failure_gallery/web_compression__s1091__enf_track.png) diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/band_snr_by_condition.png b/results/eval/2026-10-27/synthetic-v1-fallback/band_snr_by_condition.png new file mode 100644 index 0000000..114ef02 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/band_snr_by_condition.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips.csv b/results/eval/2026-10-27/synthetic-v1-fallback/clips.csv new file mode 100644 index 0000000..41def64 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips.csv @@ -0,0 +1,23 @@ +name,split,condition,class,expected,verdict,band_snr_db,time_error_s,enf_rmse_mhz,tool_calls,wall_s,reasons +camera_motion__s1060,calibration,camera_motion,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,5.667322698066812,,2.0832512460920394,11,336.8154815000016,SIGNAL_WEAK;READOUT_FROM_SIDECAR +clean__s1000,calibration,clean,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,10.770952359502434,,1.9146203230344925,10,365.17973829997936,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH +clock_ppm__s1110,calibration,clock_ppm,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,10.488611152351217,,1.9906497228040385,10,568.4642808999633,READOUT_ESTIMATED;NO_UNIQUE_MATCH +cols_axis__s1120,calibration,cols_axis,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,11.558502412338319,,1.5213806700811345,10,569.0761263999739,READOUT_ESTIMATED;NO_UNIQUE_MATCH +cut_0p5s__s1160,calibration,cut_0p5s,edited,CONTRADICTED,INCONCLUSIVE,10.597178394609175,,,10,360.51983149995795,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;DROPPED_FRAMES_EXPLAINED +cut_1s__s1170,calibration,cut_1s,edited,CONTRADICTED,INCONCLUSIVE,10.945810558334887,,,10,337.0344341000309,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;DROPPED_FRAMES_EXPLAINED +cut_2s__s1180,calibration,cut_2s,edited,CONTRADICTED,INCONCLUSIVE,10.240401586014512,,,10,388.14043470000615,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;DROPPED_FRAMES_EXPLAINED +daylight_partial__s1150,calibration,daylight_partial,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,6.884484205068202,,1.7712952412737024,11,570.2693319999962,SIGNAL_WEAK;READOUT_ESTIMATED +dropped_frames__s1050,calibration,dropped_frames,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,11.430501303684458,,1.7558799725968903,10,244.37433189997682,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;DROPPED_FRAMES_EXPLAINED +hdr__s1210,calibration,hdr,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,,,,3,3.925300500006415,HDR_UNSUPPORTED +insert_other_time__s1190,calibration,insert_other_time,edited,CONTRADICTED,INCONCLUSIVE,11.012252967489642,,,10,1134.3162747999886,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;DROPPED_FRAMES_EXPLAINED +jitter__s1040,calibration,jitter,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,11.1779909931869,,44.92517723709132,10,355.37216660002014,READOUT_ESTIMATED;NO_UNIQUE_MATCH;TIMESTAMP_JITTER_HIGH +messaging_compression__s1100,calibration,messaging_compression,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,5.865372935877823,,3.9063289639410828,12,395.88199510000413,SIGNAL_WEAK;READOUT_FROM_SIDECAR;HIGH_COMPRESSION;USER_INPUT_REQUESTED +moving_objects__s1070,calibration,moving_objects,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,8.371863761523851,,1.6402566136152097,12,453.60855629999423,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH +no_mains_light__s1140,calibration,no_mains_light,authentic-without-mains-light,INCONCLUSIVE,INCONCLUSIVE,-6.908443644399559,,322.77616720003294,12,393.9752877000137,SIGNAL_ABSENT;READOUT_FROM_SIDECAR;HIGH_COMPRESSION;USER_INPUT_REQUESTED +no_sidecar__s1010,calibration,no_sidecar,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,11.183836535373446,,1.4010336370265042,10,425.2460378999822,READOUT_ESTIMATED;NO_UNIQUE_MATCH +noisy__s1080,calibration,noisy,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,11.079885807314987,,1.1473703542737834,10,297.2581475999905,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH +reorder__s1200,calibration,reorder,edited,CONTRADICTED,CONTRADICTED,11.292476943050708,,,11,598.7187110999948,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;EDIT_CANDIDATE;DROPPED_FRAMES_EXPLAINED +rotation_meta__s1130,calibration,rotation_meta,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,10.845582705868253,,1.0944700685158173,10,575.8404226000421,READOUT_ESTIMATED;NO_UNIQUE_MATCH +short_readout_long_expo__s1030,calibration,short_readout_long_expo,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,3.8850698489890223,,2.036994190585756,11,337.2119459999958,SIGNAL_WEAK;READOUT_FROM_SIDECAR +weak_flicker__s1020,calibration,weak_flicker,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,2.9535960953235865,,1.5088952432048295,11,337.49780539999483,SIGNAL_ABSENT;READOUT_FROM_SIDECAR +web_compression__s1090,calibration,web_compression,authentic-with-mains-light,VERIFIED,INCONCLUSIVE,9.863972471622834,,1.9463938960713136,10,407.67165879998356,READOUT_FROM_SIDECAR;NO_UNIQUE_MATCH;HIGH_COMPRESSION diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/camera_motion__s1060.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/camera_motion__s1060.json new file mode 100644 index 0000000..fc060a4 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/camera_motion__s1060.json @@ -0,0 +1,64 @@ +{ + "name": "camera_motion__s1060", + "condition": "camera_motion", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 336.8154815000016, + "truth_start_utc": 1768588273.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_WEAK", + "READOUT_FROM_SIDECAR" + ], + "stage_timings_s": { + "S1_ingest": 3.3362, + "S2_linear": 13.3652, + "S3_readout": 0.0, + "S4_motion": 126.7405, + "S5_segment": 0.0146, + "S7_rowsignal": 71.8305, + "S6_patches": 10.8033, + "S8_phase": 22.5649, + "S14_overlay": 80.957, + "S15_report": 5.1305 + }, + "band_snr_db": 5.667322698066812, + "agent": { + "tool_calls": 11, + "extractions": 4, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 5.667322698066812, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\camera_motion__s1060\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\camera_motion__s1060\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\camera_motion__s1060\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\camera_motion__s1060\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\camera_motion__s1060\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\camera_motion__s1060\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 2.0832512460920394, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/clean__s1000.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/clean__s1000.json new file mode 100644 index 0000000..519f213 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/clean__s1000.json @@ -0,0 +1,79 @@ +{ + "name": "clean__s1000", + "condition": "clean", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 365.17973829997936, + "truth_start_utc": 1768799253.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH" + ], + "stage_timings_s": { + "S1_ingest": 3.2169, + "S2_linear": 21.4592, + "S3_readout": 0.0001, + "S4_motion": 129.8036, + "S5_segment": 0.3036, + "S7_rowsignal": 20.2523, + "S6_patches": 29.8118, + "S8_phase": 12.7815, + "S10_match": 1.8775, + "S11_continuity": 0.0587, + "S12_face": 0.013, + "S14_overlay": 118.0618, + "S15_report": 13.1647 + }, + "band_snr_db": 10.770952359502434, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 10.770952359502434, + "axis_ambiguous": false, + "match": { + "rho1": 0.9653036505568862, + "rho2": 0.9256119562925562, + "margin": 0.039691694264329946, + "length_s": 35.0, + "best_offset_utc": 1768799252.9424884, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clean__s1000\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.9146203230344925, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/clock_ppm__s1110.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/clock_ppm__s1110.json new file mode 100644 index 0000000..8685382 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/clock_ppm__s1110.json @@ -0,0 +1,79 @@ +{ + "name": "clock_ppm__s1110", + "condition": "clock_ppm", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 568.4642808999633, + "truth_start_utc": 1768650397.0, + "video_s": 35.967745666666666, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH" + ], + "stage_timings_s": { + "S1_ingest": 2.5501, + "S2_linear": 23.722, + "S7_rowsignal": 29.1137, + "S3_readout": 69.9591, + "S4_motion": 163.7502, + "S5_segment": 0.0338, + "S6_patches": 48.1405, + "S8_phase": 40.77, + "S10_match": 2.968, + "S11_continuity": 0.0236, + "S12_face": 0.0268, + "S14_overlay": 176.107, + "S15_report": 18.406 + }, + "band_snr_db": 10.488611152351217, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 10.488611152351217, + "axis_ambiguous": false, + "match": { + "rho1": 0.9914257694446509, + "rho2": 0.9060376445519499, + "margin": 0.08538812489270098, + "length_s": 35.0, + "best_offset_utc": 1768650396.9725108, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\clock_ppm__s1110\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.9906497228040385, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/cols_axis__s1120.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cols_axis__s1120.json new file mode 100644 index 0000000..bb18ff3 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cols_axis__s1120.json @@ -0,0 +1,79 @@ +{ + "name": "cols_axis__s1120", + "condition": "cols_axis", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 569.0761263999739, + "truth_start_utc": 1768527177.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH" + ], + "stage_timings_s": { + "S1_ingest": 2.4994, + "S2_linear": 23.1243, + "S7_rowsignal": 27.9026, + "S3_readout": 68.9881, + "S4_motion": 164.4902, + "S5_segment": 0.0206, + "S6_patches": 56.7186, + "S8_phase": 40.6849, + "S10_match": 4.5033, + "S11_continuity": 0.1328, + "S12_face": 0.0034, + "S14_overlay": 175.6906, + "S15_report": 12.7015 + }, + "band_snr_db": 11.558502412338319, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 11.558502412338319, + "axis_ambiguous": false, + "match": { + "rho1": 0.9910516131491466, + "rho2": 0.9796931858527276, + "margin": 0.011358427296419005, + "length_s": 35.0, + "best_offset_utc": 1768527176.7305112, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cols_axis__s1120\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.5213806700811345, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_0p5s__s1160.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_0p5s__s1160.json new file mode 100644 index 0000000..0e6008c --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_0p5s__s1160.json @@ -0,0 +1,90 @@ +{ + "name": "cut_0p5s__s1160", + "condition": "cut_0p5s", + "split": "calibration", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 360.51983149995795, + "truth_start_utc": 1768594498.0, + "video_s": 35.46666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 3.1844, + "S2_linear": 14.4041, + "S3_readout": 0.0023, + "S4_motion": 123.8957, + "S5_segment": 0.1388, + "S7_rowsignal": 43.0254, + "S6_patches": 10.9747, + "S8_phase": 4.7187, + "S10_match": 1.6094, + "S11_continuity": 0.0262, + "S12_face": 0.0029, + "S14_overlay": 146.8293, + "S15_report": 9.6472 + }, + "band_snr_db": 10.597178394609175, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 10.597178394609175, + "axis_ambiguous": false, + "match": { + "rho1": 0.9853863931448361, + "rho2": 0.9449262573801037, + "margin": 0.0404601357647324, + "length_s": 35.0, + "best_offset_utc": 1768594498.0091438, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 15.833333332999985, + "z": 0.12787424903596817, + "rad": 0.009115286306571768, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_0p5s__s1160\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [ + 15.333333333333334 + ], + "edit_events_t_s": [], + "edit_localization_error_s": [], + "edit_detected": false, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_1s__s1170.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_1s__s1170.json new file mode 100644 index 0000000..e48f903 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_1s__s1170.json @@ -0,0 +1,90 @@ +{ + "name": "cut_1s__s1170", + "condition": "cut_1s", + "split": "calibration", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 337.0344341000309, + "truth_start_utc": 1768909916.0, + "video_s": 34.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 6.2262, + "S2_linear": 29.3779, + "S3_readout": 0.0072, + "S4_motion": 83.736, + "S5_segment": 0.2428, + "S7_rowsignal": 36.7181, + "S6_patches": 16.7921, + "S8_phase": 4.7745, + "S10_match": 4.617, + "S11_continuity": 0.0688, + "S12_face": 0.0532, + "S14_overlay": 142.7712, + "S15_report": 10.2408 + }, + "band_snr_db": 10.945810558334887, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 10.945810558334887, + "axis_ambiguous": false, + "match": { + "rho1": 0.9088233969317351, + "rho2": 0.877543619598355, + "margin": 0.031279777333380054, + "length_s": 35.0, + "best_offset_utc": 1768909915.9593146, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 18.099999999999994, + "z": 0.519364032605352, + "rad": 0.06506313848651502, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_1s__s1170\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [ + 17.1 + ], + "edit_events_t_s": [], + "edit_localization_error_s": [], + "edit_detected": false, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_2s__s1180.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_2s__s1180.json new file mode 100644 index 0000000..f7f1ec4 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/cut_2s__s1180.json @@ -0,0 +1,90 @@ +{ + "name": "cut_2s__s1180", + "condition": "cut_2s", + "split": "calibration", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 388.14043470000615, + "truth_start_utc": 1768705394.0, + "video_s": 33.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 5.5611, + "S2_linear": 22.3886, + "S3_readout": 0.0004, + "S4_motion": 161.8572, + "S5_segment": 0.0405, + "S7_rowsignal": 28.902, + "S6_patches": 16.3413, + "S8_phase": 5.3232, + "S10_match": 2.4303, + "S11_continuity": 0.0183, + "S12_face": 0.0097, + "S14_overlay": 136.1491, + "S15_report": 7.5366 + }, + "band_snr_db": 10.240401586014512, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 10.240401586014512, + "axis_ambiguous": false, + "match": { + "rho1": 0.990779504479461, + "rho2": 0.9695022884161496, + "margin": 0.021277216063311344, + "length_s": 35.0, + "best_offset_utc": 1768705393.9213698, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 14.699999999999989, + "z": 0.0, + "rad": NaN, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\cut_2s__s1180\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [ + 12.7 + ], + "edit_events_t_s": [], + "edit_localization_error_s": [], + "edit_detected": false, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/daylight_partial__s1150.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/daylight_partial__s1150.json new file mode 100644 index 0000000..aa4f53b --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/daylight_partial__s1150.json @@ -0,0 +1,64 @@ +{ + "name": "daylight_partial__s1150", + "condition": "daylight_partial", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 570.2693319999962, + "truth_start_utc": 1768762915.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_WEAK", + "READOUT_ESTIMATED" + ], + "stage_timings_s": { + "S1_ingest": 4.1052, + "S2_linear": 20.0198, + "S7_rowsignal": 49.5628, + "S3_readout": 83.5103, + "S4_motion": 128.609, + "S5_segment": 0.1232, + "S6_patches": 49.0755, + "S8_phase": 117.587, + "S14_overlay": 118.5368, + "S15_report": 10.4515 + }, + "band_snr_db": 6.884484205068202, + "agent": { + "tool_calls": 11, + "extractions": 4, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 6.884484205068202, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\daylight_partial__s1150\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\daylight_partial__s1150\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\daylight_partial__s1150\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\daylight_partial__s1150\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\daylight_partial__s1150\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\daylight_partial__s1150\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.7712952412737024, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/dropped_frames__s1050.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/dropped_frames__s1050.json new file mode 100644 index 0000000..4cee3dd --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/dropped_frames__s1050.json @@ -0,0 +1,93 @@ +{ + "name": "dropped_frames__s1050", + "condition": "dropped_frames", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 244.37433189997682, + "truth_start_utc": 1768854807.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 2.7337, + "S2_linear": 15.4078, + "S3_readout": 0.0, + "S4_motion": 91.2908, + "S5_segment": 0.0004, + "S7_rowsignal": 4.7025, + "S6_patches": 12.9397, + "S8_phase": 3.6589, + "S10_match": 0.9694, + "S11_continuity": 0.0062, + "S12_face": 0.0005, + "S14_overlay": 105.1917, + "S15_report": 6.9579 + }, + "band_snr_db": 11.430501303684458, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.430501303684458, + "axis_ambiguous": false, + "match": { + "rho1": 0.9921197913963462, + "rho2": 0.9511364099946079, + "margin": 0.040983381401738295, + "length_s": 35.0, + "best_offset_utc": 1768854806.813472, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 13.46666666599998, + "z": 0.3613459677744159, + "rad": 0.014627869951819417, + "gap": true + }, + { + "t_s": 23.566666666000003, + "z": 0.46657460926716265, + "rad": 0.015692901334527498, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\dropped_frames__s1050\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.7558799725968903, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/hdr__s1210.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/hdr__s1210.json new file mode 100644 index 0000000..fdfdbf1 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/hdr__s1210.json @@ -0,0 +1,50 @@ +{ + "name": "hdr__s1210", + "condition": "hdr", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 3.925300500006415, + "truth_start_utc": 1768628036.0, + "video_s": 5.966666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "HDR_UNSUPPORTED" + ], + "stage_timings_s": { + "S1_ingest": 2.8622, + "S14_overlay": 0.0, + "S15_report": 0.949 + }, + "band_snr_db": null, + "agent": { + "tool_calls": 3, + "extractions": 0, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HDR_UNSUPPORTED" + ] + }, + "artifacts": { + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\hdr__s1210\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\hdr__s1210\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\hdr__s1210\\result.json" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/insert_other_time__s1190.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/insert_other_time__s1190.json new file mode 100644 index 0000000..625e357 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/insert_other_time__s1190.json @@ -0,0 +1,113 @@ +{ + "name": "insert_other_time__s1190", + "condition": "insert_other_time", + "split": "calibration", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 1134.3162747999886, + "truth_start_utc": 1768737804.0, + "video_s": 101.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 7.9868, + "S2_linear": 128.7785, + "S3_readout": 0.0032, + "S4_motion": 303.8599, + "S5_segment": 0.0214, + "S7_rowsignal": 56.8206, + "S6_patches": 71.4072, + "S8_phase": 48.8569, + "S10_match": 1.4011, + "S11_continuity": 0.0562, + "S12_face": 0.0025, + "S14_overlay": 497.0648, + "S15_report": 16.3729 + }, + "band_snr_db": 11.012252967489642, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.012252967489642, + "axis_ambiguous": false, + "match": { + "rho1": 0.9936804938567109, + "rho2": 0.8960336909645847, + "margin": 0.09764680289212613, + "length_s": 69.0, + "best_offset_utc": 1768737803.9242845, + "coverage": true, + "segment_stats": [ + { + "rho1": 0.9935035946610196, + "offset": 1768737803.917714, + "margin": 0.010263602517136983 + }, + { + "rho1": 0.9901438472882539, + "offset": 1768737803.8663437, + "margin": 0.01891666017170257 + } + ] + }, + "boundaries": [ + { + "t_s": -1469.933333333, + "z": 3.10069436071448, + "rad": 2.9873018482494693, + "gap": false + }, + { + "t_s": -1448.0666666660002, + "z": 10.583081981887535, + "rad": 0.5466187180791628, + "gap": false + }, + { + "t_s": 30.0, + "z": 0.0, + "rad": NaN, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\insert_other_time__s1190\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [ + 30.0 + ], + "edit_events_t_s": [], + "edit_localization_error_s": [], + "edit_detected": false, + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/jitter__s1040.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/jitter__s1040.json new file mode 100644 index 0000000..bae054c --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/jitter__s1040.json @@ -0,0 +1,100 @@ +{ + "name": "jitter__s1040", + "condition": "jitter", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 355.37216660002014, + "truth_start_utc": 1768483175.0, + "video_s": 35.967420496891606, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH", + "TIMESTAMP_JITTER_HIGH" + ], + "stage_timings_s": { + "S1_ingest": 3.136, + "S2_linear": 16.7429, + "S7_rowsignal": 12.7028, + "S3_readout": 45.0939, + "S4_motion": 92.9305, + "S5_segment": 0.0506, + "S6_patches": 38.4856, + "S8_phase": 25.0874, + "S10_match": 4.3386, + "S11_continuity": 0.006, + "S12_face": 0.0027, + "S14_overlay": 108.3847, + "S15_report": 13.132 + }, + "band_snr_db": 11.1779909931869, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED", + "TIMESTAMP_JITTER_HIGH" + ], + "band_snr_db": 11.1779909931869, + "axis_ambiguous": false, + "match": { + "rho1": 0.7328393784655547, + "rho2": 0.7250440656957988, + "margin": 0.007795312769755869, + "length_s": 35.0, + "best_offset_utc": 1768482519.3582969, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 17.332744444444444, + "z": 3.1137682297368943, + "rad": 0.9535170912421007, + "gap": false + }, + { + "t_s": 28.166733333333333, + "z": 4.8122655577673195, + "rad": 3.057536955746437, + "gap": false + }, + { + "t_s": 35.26537777777778, + "z": 3.2594252672278925, + "rad": 1.2361027440805898, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\jitter__s1040\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 44.92517723709132, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/messaging_compression__s1100.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/messaging_compression__s1100.json new file mode 100644 index 0000000..3ebeaa1 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/messaging_compression__s1100.json @@ -0,0 +1,69 @@ +{ + "name": "messaging_compression__s1100", + "condition": "messaging_compression", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 395.88199510000413, + "truth_start_utc": 1768635970.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_WEAK", + "READOUT_FROM_SIDECAR", + "HIGH_COMPRESSION", + "USER_INPUT_REQUESTED" + ], + "stage_timings_s": { + "S1_ingest": 3.6019, + "S2_linear": 24.3364, + "S3_readout": 0.0024, + "S4_motion": 161.4737, + "S5_segment": 0.0075, + "S7_rowsignal": 53.4891, + "S6_patches": 17.3259, + "S8_phase": 26.0287, + "S14_overlay": 102.3296, + "S15_report": 5.7506 + }, + "band_snr_db": 5.865372935877823, + "agent": { + "tool_calls": 12, + "extractions": 4, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [ + "original_file" + ], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HIGH_COMPRESSION", + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 5.865372935877823, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\messaging_compression__s1100\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\messaging_compression__s1100\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\messaging_compression__s1100\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\messaging_compression__s1100\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\messaging_compression__s1100\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\messaging_compression__s1100\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 3.9063289639410828, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/moving_objects__s1070.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/moving_objects__s1070.json new file mode 100644 index 0000000..015d929 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/moving_objects__s1070.json @@ -0,0 +1,79 @@ +{ + "name": "moving_objects__s1070", + "condition": "moving_objects", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 453.60855629999423, + "truth_start_utc": 1768618187.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH" + ], + "stage_timings_s": { + "S1_ingest": 2.3157, + "S2_linear": 10.1399, + "S3_readout": 0.0001, + "S4_motion": 139.4763, + "S5_segment": 0.013, + "S7_rowsignal": 108.8441, + "S6_patches": 21.4578, + "S8_phase": 27.3938, + "S10_match": 1.7477, + "S11_continuity": 0.0027, + "S12_face": 0.0024, + "S14_overlay": 133.6157, + "S15_report": 7.8931 + }, + "band_snr_db": 8.371863761523851, + "agent": { + "tool_calls": 12, + "extractions": 2, + "first_extraction_weak": true, + "recovered_signal": true, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 8.371863761523851, + "axis_ambiguous": false, + "match": { + "rho1": 0.9927042743242807, + "rho2": 0.9341499471331232, + "margin": 0.058554327191157496, + "length_s": 35.0, + "best_offset_utc": 1768618187.0786216, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\moving_objects__s1070\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.6402566136152097, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/no_mains_light__s1140.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/no_mains_light__s1140.json new file mode 100644 index 0000000..7dde586 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/no_mains_light__s1140.json @@ -0,0 +1,69 @@ +{ + "name": "no_mains_light__s1140", + "condition": "no_mains_light", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-without-mains-light", + "expected_verdict": "INCONCLUSIVE", + "planner": "fallback", + "wall_s": 393.9752877000137, + "truth_start_utc": 1768948607.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_FROM_SIDECAR", + "HIGH_COMPRESSION", + "USER_INPUT_REQUESTED" + ], + "stage_timings_s": { + "S1_ingest": 4.0382, + "S2_linear": 13.724, + "S3_readout": 0.0001, + "S4_motion": 182.0163, + "S5_segment": 0.0128, + "S7_rowsignal": 28.5613, + "S6_patches": 21.5648, + "S8_phase": 29.6227, + "S14_overlay": 90.2443, + "S15_report": 23.1585 + }, + "band_snr_db": -6.908443644399559, + "agent": { + "tool_calls": 12, + "extractions": 4, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [ + "original_file" + ], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HIGH_COMPRESSION", + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": -6.908443644399559, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_mains_light__s1140\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_mains_light__s1140\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_mains_light__s1140\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_mains_light__s1140\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_mains_light__s1140\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_mains_light__s1140\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 322.77616720003294, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/no_sidecar__s1010.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/no_sidecar__s1010.json new file mode 100644 index 0000000..64058a6 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/no_sidecar__s1010.json @@ -0,0 +1,86 @@ +{ + "name": "no_sidecar__s1010", + "condition": "no_sidecar", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 425.2460378999822, + "truth_start_utc": 1768966550.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH" + ], + "stage_timings_s": { + "S1_ingest": 3.15, + "S2_linear": 21.6767, + "S7_rowsignal": 39.4401, + "S3_readout": 49.9217, + "S4_motion": 131.0528, + "S5_segment": 0.0184, + "S6_patches": 34.9814, + "S8_phase": 25.1334, + "S10_match": 2.4785, + "S11_continuity": 0.007, + "S12_face": 0.0036, + "S14_overlay": 119.7214, + "S15_report": 6.2472 + }, + "band_snr_db": 11.183836535373446, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 11.183836535373446, + "axis_ambiguous": false, + "match": { + "rho1": 0.9761843832777521, + "rho2": 0.9301147129739282, + "margin": 0.04606967030382392, + "length_s": 35.0, + "best_offset_utc": 1768966550.2031295, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 8.766666666666667, + "z": 3.177953371143862, + "rad": 0.06527711626027433, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\no_sidecar__s1010\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.4010336370265042, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/noisy__s1080.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/noisy__s1080.json new file mode 100644 index 0000000..1edb744 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/noisy__s1080.json @@ -0,0 +1,79 @@ +{ + "name": "noisy__s1080", + "condition": "noisy", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 297.2581475999905, + "truth_start_utc": 1768898700.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH" + ], + "stage_timings_s": { + "S1_ingest": 3.0399, + "S2_linear": 11.941, + "S3_readout": 0.0017, + "S4_motion": 86.6981, + "S5_segment": 0.0065, + "S7_rowsignal": 15.7432, + "S6_patches": 25.8467, + "S8_phase": 6.9136, + "S10_match": 1.6242, + "S11_continuity": 0.0128, + "S12_face": 0.0017, + "S14_overlay": 136.5263, + "S15_report": 8.1627 + }, + "band_snr_db": 11.079885807314987, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.079885807314987, + "axis_ambiguous": false, + "match": { + "rho1": 0.993137984995591, + "rho2": 0.8713682808109243, + "margin": 0.1217697041846667, + "length_s": 35.0, + "best_offset_utc": 1768898699.9686723, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\noisy__s1080\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.1473703542737834, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/reorder__s1200.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/reorder__s1200.json new file mode 100644 index 0000000..16c1c23 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/reorder__s1200.json @@ -0,0 +1,119 @@ +{ + "name": "reorder__s1200", + "condition": "reorder", + "split": "calibration", + "label": "SYNTHETIC", + "class": "edited", + "expected_verdict": "CONTRADICTED", + "planner": "fallback", + "wall_s": 598.7187110999948, + "truth_start_utc": 1768973491.0, + "video_s": 69.96666666666667, + "verdict": "CONTRADICTED", + "lifecycle_state": "PENDING_REVIEW", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "EDIT_CANDIDATE", + "DROPPED_FRAMES_EXPLAINED" + ], + "stage_timings_s": { + "S1_ingest": 5.1208, + "S2_linear": 75.2334, + "S3_readout": 0.0025, + "S4_motion": 221.5724, + "S5_segment": 0.0208, + "S7_rowsignal": 34.8203, + "S6_patches": 24.9563, + "S8_phase": 8.6393, + "S10_match": 1.3626, + "S11_continuity": 0.0056, + "S12_face": 0.0031, + "S14_overlay": 219.159, + "S15_report": 6.9686 + }, + "band_snr_db": 11.292476943050708, + "agent": { + "tool_calls": 11, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": true + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 11.292476943050708, + "axis_ambiguous": false, + "match": { + "rho1": 0.7189788230977092, + "rho2": 0.6502600483251488, + "margin": 0.06871877477256039, + "length_s": 69.0, + "best_offset_utc": 1768971918.2808151, + "coverage": true, + "segment_stats": [ + { + "rho1": 0.8224029708149018, + "offset": 1768972750.5093386, + "margin": 0.019170301864774864 + }, + { + "rho1": 0.9153304710228405, + "offset": 1768970316.286071, + "margin": 0.005480897670274598 + } + ] + }, + "boundaries": [ + { + "t_s": 36.0, + "z": 0.0, + "rad": NaN, + "gap": true + }, + { + "t_s": 33.033333333, + "z": 38.2894911541881, + "rad": 3.102362373592486, + "gap": false + }, + { + "t_s": 4.5, + "z": 16.928925629748377, + "rad": 3.1036211610001496, + "gap": false + }, + { + "t_s": 66.0, + "z": 0.0, + "rad": NaN, + "gap": true + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\reorder__s1200\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "edits_true_t_s": [], + "edit_events_t_s": [ + 33.033333333, + 4.5 + ], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/rotation_meta__s1130.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/rotation_meta__s1130.json new file mode 100644 index 0000000..4708f91 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/rotation_meta__s1130.json @@ -0,0 +1,79 @@ +{ + "name": "rotation_meta__s1130", + "condition": "rotation_meta", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 575.8404226000421, + "truth_start_utc": 1768480039.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_ESTIMATED", + "NO_UNIQUE_MATCH" + ], + "stage_timings_s": { + "S1_ingest": 5.6255, + "S2_linear": 15.0155, + "S7_rowsignal": 35.1629, + "S3_readout": 54.5354, + "S4_motion": 215.8121, + "S5_segment": 0.1378, + "S6_patches": 63.5224, + "S8_phase": 48.8213, + "S10_match": 2.9207, + "S11_continuity": 0.0445, + "S12_face": 0.0304, + "S14_overlay": 126.8477, + "S15_report": 13.5636 + }, + "band_snr_db": 10.845582705868253, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_ESTIMATED" + ], + "band_snr_db": 10.845582705868253, + "axis_ambiguous": false, + "match": { + "rho1": 0.9981536871694473, + "rho2": 0.9879628900405015, + "margin": 0.010190797128945772, + "length_s": 35.0, + "best_offset_utc": 1768480039.1518385, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\rotation_meta__s1130\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.0944700685158173, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/short_readout_long_expo__s1030.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/short_readout_long_expo__s1030.json new file mode 100644 index 0000000..f9172b8 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/short_readout_long_expo__s1030.json @@ -0,0 +1,64 @@ +{ + "name": "short_readout_long_expo__s1030", + "condition": "short_readout_long_expo", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 337.2119459999958, + "truth_start_utc": 1768924512.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_WEAK", + "READOUT_FROM_SIDECAR" + ], + "stage_timings_s": { + "S1_ingest": 2.8554, + "S2_linear": 22.2823, + "S3_readout": 0.0002, + "S4_motion": 121.4615, + "S5_segment": 0.003, + "S7_rowsignal": 10.9768, + "S6_patches": 55.1197, + "S8_phase": 20.3792, + "S14_overlay": 83.3296, + "S15_report": 11.1947 + }, + "band_snr_db": 3.8850698489890223, + "agent": { + "tool_calls": 11, + "extractions": 4, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 3.8850698489890223, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1030\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1030\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1030\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1030\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1030\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\short_readout_long_expo__s1030\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 2.036994190585756, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/weak_flicker__s1020.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/weak_flicker__s1020.json new file mode 100644 index 0000000..256f62c --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/weak_flicker__s1020.json @@ -0,0 +1,64 @@ +{ + "name": "weak_flicker__s1020", + "condition": "weak_flicker", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 337.49780539999483, + "truth_start_utc": 1768732688.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_FROM_SIDECAR" + ], + "stage_timings_s": { + "S1_ingest": 3.0364, + "S2_linear": 22.3393, + "S3_readout": 0.0004, + "S4_motion": 135.3129, + "S5_segment": 0.3107, + "S7_rowsignal": 12.6292, + "S6_patches": 20.9266, + "S8_phase": 33.815, + "S14_overlay": 86.4099, + "S15_report": 10.1709 + }, + "band_snr_db": 2.9535960953235865, + "agent": { + "tool_calls": 11, + "extractions": 4, + "first_extraction_weak": true, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 2.9535960953235865, + "axis_ambiguous": false + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\weak_flicker__s1020\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\weak_flicker__s1020\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\weak_flicker__s1020\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\weak_flicker__s1020\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\weak_flicker__s1020\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\weak_flicker__s1020\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.5088952432048295, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/clips/web_compression__s1090.json b/results/eval/2026-10-27/synthetic-v1-fallback/clips/web_compression__s1090.json new file mode 100644 index 0000000..dd849e9 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/clips/web_compression__s1090.json @@ -0,0 +1,94 @@ +{ + "name": "web_compression__s1090", + "condition": "web_compression", + "split": "calibration", + "label": "SYNTHETIC", + "class": "authentic-with-mains-light", + "expected_verdict": "VERIFIED", + "planner": "fallback", + "wall_s": 407.67165879998356, + "truth_start_utc": 1768573974.0, + "video_s": 35.96666666666667, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "READOUT_FROM_SIDECAR", + "NO_UNIQUE_MATCH", + "HIGH_COMPRESSION" + ], + "stage_timings_s": { + "S1_ingest": 4.3592, + "S2_linear": 18.8021, + "S3_readout": 0.0162, + "S4_motion": 164.9122, + "S5_segment": 0.018, + "S7_rowsignal": 11.8008, + "S6_patches": 31.5499, + "S8_phase": 13.8714, + "S10_match": 1.9397, + "S11_continuity": 0.0039, + "S12_face": 0.0032, + "S14_overlay": 148.7876, + "S15_report": 10.325 + }, + "band_snr_db": 9.863972471622834, + "agent": { + "tool_calls": 10, + "extractions": 1, + "first_extraction_weak": false, + "recovered_signal": false, + "unnecessary_calls": 0, + "policy_interventions": 0, + "budget_exhausted": false, + "user_input_requested": [], + "review_requested": false + }, + "raw": { + "persistent_reasons": [ + "HIGH_COMPRESSION", + "READOUT_FROM_SIDECAR" + ], + "band_snr_db": 9.863972471622834, + "axis_ambiguous": false, + "match": { + "rho1": 0.8032186101922333, + "rho2": 0.7579434176355409, + "margin": 0.045275192556692434, + "length_s": 35.0, + "best_offset_utc": 1768573974.1645672, + "coverage": true, + "segment_stats": [] + }, + "boundaries": [ + { + "t_s": 16.099999999999994, + "z": 4.156823790220421, + "rad": 0.12792107655418583, + "gap": false + }, + { + "t_s": 32.19999999999999, + "z": 3.1457643588950175, + "rad": 0.1328181283788883, + "gap": false + } + ] + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\enf_track.png", + "plot_ncc_scan": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\ncc_scan.png", + "plot_phase_residual": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\phase_residual.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\eval\\2026-10-27\\synthetic-v1-fallback\\work\\web_compression__s1090\\band_amplitude.png" + }, + "time_error_s": null, + "time_uncertainty_s": null, + "zone": null, + "enf_rmse_mhz": 1.9463938960713136, + "edits_true_t_s": [], + "edit_events_t_s": [], + "dropped_false_alarm": false +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/camera_motion__s1060__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/camera_motion__s1060__enf_track.png new file mode 100644 index 0000000..0885483 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/camera_motion__s1060__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clean__s1000__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clean__s1000__enf_track.png new file mode 100644 index 0000000..3ccc447 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clean__s1000__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clean__s1000__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clean__s1000__phase_residual.png new file mode 100644 index 0000000..c951b8e Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clean__s1000__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clock_ppm__s1110__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clock_ppm__s1110__enf_track.png new file mode 100644 index 0000000..fa9c773 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clock_ppm__s1110__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clock_ppm__s1110__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clock_ppm__s1110__phase_residual.png new file mode 100644 index 0000000..fa94d90 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/clock_ppm__s1110__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cols_axis__s1120__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cols_axis__s1120__enf_track.png new file mode 100644 index 0000000..e6a8b21 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cols_axis__s1120__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cols_axis__s1120__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cols_axis__s1120__phase_residual.png new file mode 100644 index 0000000..ff7b828 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cols_axis__s1120__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1160__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1160__enf_track.png new file mode 100644 index 0000000..58b598e Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1160__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1160__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1160__phase_residual.png new file mode 100644 index 0000000..c46ee1a Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_0p5s__s1160__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_1s__s1170__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_1s__s1170__enf_track.png new file mode 100644 index 0000000..f9c5697 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_1s__s1170__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_1s__s1170__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_1s__s1170__phase_residual.png new file mode 100644 index 0000000..0df162f Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_1s__s1170__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_2s__s1180__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_2s__s1180__enf_track.png new file mode 100644 index 0000000..ae8f8fc Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_2s__s1180__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_2s__s1180__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_2s__s1180__phase_residual.png new file mode 100644 index 0000000..8cd6a76 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/cut_2s__s1180__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/daylight_partial__s1150__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/daylight_partial__s1150__enf_track.png new file mode 100644 index 0000000..da70065 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/daylight_partial__s1150__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/dropped_frames__s1050__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/dropped_frames__s1050__enf_track.png new file mode 100644 index 0000000..c2f378e Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/dropped_frames__s1050__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/dropped_frames__s1050__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/dropped_frames__s1050__phase_residual.png new file mode 100644 index 0000000..0fde766 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/dropped_frames__s1050__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/insert_other_time__s1190__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/insert_other_time__s1190__enf_track.png new file mode 100644 index 0000000..1b3c5b6 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/insert_other_time__s1190__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/insert_other_time__s1190__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/insert_other_time__s1190__phase_residual.png new file mode 100644 index 0000000..218b24a Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/insert_other_time__s1190__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/jitter__s1040__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/jitter__s1040__enf_track.png new file mode 100644 index 0000000..697f847 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/jitter__s1040__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/jitter__s1040__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/jitter__s1040__phase_residual.png new file mode 100644 index 0000000..3f11b2a Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/jitter__s1040__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/messaging_compression__s1100__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/messaging_compression__s1100__enf_track.png new file mode 100644 index 0000000..c0b37e6 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/messaging_compression__s1100__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/moving_objects__s1070__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/moving_objects__s1070__enf_track.png new file mode 100644 index 0000000..1438f93 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/moving_objects__s1070__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/moving_objects__s1070__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/moving_objects__s1070__phase_residual.png new file mode 100644 index 0000000..4e31c05 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/moving_objects__s1070__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/no_sidecar__s1010__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/no_sidecar__s1010__enf_track.png new file mode 100644 index 0000000..5e2ecc6 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/no_sidecar__s1010__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/no_sidecar__s1010__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/no_sidecar__s1010__phase_residual.png new file mode 100644 index 0000000..e77820f Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/no_sidecar__s1010__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/noisy__s1080__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/noisy__s1080__enf_track.png new file mode 100644 index 0000000..83f2460 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/noisy__s1080__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/noisy__s1080__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/noisy__s1080__phase_residual.png new file mode 100644 index 0000000..8f37f99 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/noisy__s1080__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/rotation_meta__s1130__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/rotation_meta__s1130__enf_track.png new file mode 100644 index 0000000..711a5c7 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/rotation_meta__s1130__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/rotation_meta__s1130__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/rotation_meta__s1130__phase_residual.png new file mode 100644 index 0000000..9cd495f Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/rotation_meta__s1130__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/short_readout_long_expo__s1030__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/short_readout_long_expo__s1030__enf_track.png new file mode 100644 index 0000000..60b6994 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/short_readout_long_expo__s1030__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/weak_flicker__s1020__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/weak_flicker__s1020__enf_track.png new file mode 100644 index 0000000..034aba8 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/weak_flicker__s1020__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/web_compression__s1090__enf_track.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/web_compression__s1090__enf_track.png new file mode 100644 index 0000000..8b54fd8 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/web_compression__s1090__enf_track.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/web_compression__s1090__phase_residual.png b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/web_compression__s1090__phase_residual.png new file mode 100644 index 0000000..97518a8 Binary files /dev/null and b/results/eval/2026-10-27/synthetic-v1-fallback/failure_gallery/web_compression__s1090__phase_residual.png differ diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/run_meta.json b/results/eval/2026-10-27/synthetic-v1-fallback/run_meta.json new file mode 100644 index 0000000..6da6117 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/run_meta.json @@ -0,0 +1,9 @@ +{ + "suite": "synthetic-v1", + "data": "../../data/synthetic/v1", + "planner": "fallback", + "split": "calibration", + "date": "2026-10-27", + "label": "SYNTHETIC", + "thresholds_hash": "5c105287d4e1c479" +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/summary.json b/results/eval/2026-10-27/synthetic-v1-fallback/summary.json new file mode 100644 index 0000000..b20f9fb --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/summary.json @@ -0,0 +1,1101 @@ +{ + "label": "SYNTHETIC", + "meta": { + "suite": "synthetic-v1", + "data": "../../data/synthetic/v1", + "planner": "fallback", + "split": "calibration", + "date": "2026-10-27", + "label": "SYNTHETIC", + "thresholds_hash": "5c105287d4e1c479" + }, + "calibration": { + "n_clips": 22, + "confusion": { + "authentic-with-mains-light": { + "VERIFIED": 0, + "CONTRADICTED": 0, + "INCONCLUSIVE": 16, + "None": 0 + }, + "authentic-without-mains-light": { + "VERIFIED": 0, + "CONTRADICTED": 0, + "INCONCLUSIVE": 1, + "None": 0 + }, + "edited": { + "VERIFIED": 0, + "CONTRADICTED": 1, + "INCONCLUSIVE": 4, + "None": 0 + }, + "synthetic": { + "VERIFIED": 0, + "CONTRADICTED": 0, + "INCONCLUSIVE": 0, + "None": 0 + } + }, + "false_contradicted_rate": { + "k": 0, + "n": 17, + "rate": 0.0, + "ci95": [ + 0.0, + 0.18432366037156456 + ] + }, + "verified_coverage_mains": { + "k": 0, + "n": 16, + "rate": 0.0, + "ci95": [ + 0.0, + 0.19361341827271994 + ] + }, + "per_condition": { + "camera_motion": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "clean": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "clock_ppm": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "cols_axis": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "cut_0p5s": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "cut_1s": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "cut_2s": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "daylight_partial": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "dropped_frames": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "hdr": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "insert_other_time": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "jitter": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "messaging_compression": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "moving_objects": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "no_mains_light": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "no_sidecar": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "noisy": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "reorder": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "contradicted": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "task_success": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + } + }, + "rotation_meta": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "short_readout_long_expo": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "weak_flicker": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + }, + "web_compression": { + "n": 1, + "verified": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "inconclusive": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "contradicted": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "task_success": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + } + } + }, + "time_error_verified_s": { + "n": 0 + }, + "enf_rmse_mhz": { + "n": 16, + "mean": 24.588760286265053, + "median": 1.8429577821540974, + "p95": 114.38792472782673, + "max": 322.77616720003294 + }, + "edit_detection": { + "k": 0, + "n": 5, + "rate": 0.0, + "ci95": [ + 0.0, + 0.43449149475208104 + ] + }, + "edit_localization_error_s": { + "n": 0 + }, + "dropped_frame_false_alarm": { + "k": 0, + "n": 1, + "rate": 0.0, + "ci95": [ + 0.0, + 0.7934567085261071 + ] + }, + "agent": { + "task_success": { + "k": 2, + "n": 22, + "rate": 0.09090909090909091, + "ci95": [ + 0.025294896282837792, + 0.2781538065838578 + ] + }, + "recovery_rate": { + "k": 1, + "n": 7, + "rate": 0.14285714285714285, + "ci95": [ + 0.02567895594897479, + 0.51313450331903 + ] + }, + "tool_calls_per_job": { + "n": 22, + "mean": 10.181818181818182, + "median": 10.0, + "p95": 12.0, + "max": 12.0 + }, + "unnecessary_call_rate": { + "k": 0, + "n": 224, + "rate": 0.0, + "ci95": [ + 0.0, + 0.01686083665142801 + ] + }, + "human_review_precision": { + "k": 1, + "n": 1, + "rate": 1.0, + "ci95": [ + 0.20654329147389294, + 1.0 + ] + }, + "budget_exhaustion_rate": { + "k": 0, + "n": 22, + "rate": 0.0, + "ci95": [ + 1.3877787807814457e-17, + 0.14865952572596125 + ] + }, + "user_input_requests": { + "original_file": 2 + } + }, + "runtime_per_stage_s": { + "S10_match": { + "n": 15, + "mean": 2.4525333333333332, + "median": 1.9397, + "p95": 4.53741, + "max": 4.617 + }, + "S11_continuity": { + "n": 15, + "mean": 0.031553333333333336, + "median": 0.0183, + "p95": 0.08799999999999994, + "max": 0.1328 + }, + "S12_face": { + "n": 15, + "mean": 0.010606666666666669, + "median": 0.0032, + "p95": 0.037239999999999975, + "max": 0.0532 + }, + "S14_overlay": { + "n": 22, + "mean": 138.75977727272726, + "median": 123.28455, + "p95": 217.00639999999996, + "max": 497.0648 + }, + "S15_report": { + "n": 22, + "mean": 10.36934090909091, + "median": 10.20585, + "p95": 18.304344999999998, + "max": 23.1585 + }, + "S1_ingest": { + "n": 22, + "mean": 3.842781818181819, + "median": 3.20065, + "p95": 6.196165, + "max": 7.9868 + }, + "S2_linear": { + "n": 21, + "mean": 26.870519047619048, + "median": 21.4592, + "p95": 75.2334, + "max": 128.7785 + }, + "S3_readout": { + "n": 21, + "mean": 17.71644285714286, + "median": 0.0024, + "p95": 69.9591, + "max": 83.5103 + }, + "S4_motion": { + "n": 21, + "mean": 149.0834238095238, + "median": 135.3129, + "p95": 221.5724, + "max": 303.8599 + }, + "S5_segment": { + "n": 21, + "mean": 0.07327619047619047, + "median": 0.0208, + "p95": 0.3036, + "max": 0.3107 + }, + "S6_patches": { + "n": 21, + "mean": 32.321038095238094, + "median": 25.8467, + "p95": 63.5224, + "max": 71.4072 + }, + "S7_rowsignal": { + "n": 21, + "mean": 34.90481428571429, + "median": 29.1137, + "p95": 71.8305, + "max": 108.8441 + }, + "S8_phase": { + "n": 21, + "mean": 27.020300000000002, + "median": 25.0874, + "p95": 48.8569, + "max": 117.587 + } + }, + "errors": [] + } +} \ No newline at end of file diff --git a/results/eval/2026-10-27/synthetic-v1-fallback/summary.md b/results/eval/2026-10-27/synthetic-v1-fallback/summary.md new file mode 100644 index 0000000..3e8b559 --- /dev/null +++ b/results/eval/2026-10-27/synthetic-v1-fallback/summary.md @@ -0,0 +1,193 @@ +# Evaluation summary — SYNTHETIC + +Run: `synthetic-v1-fallback`, date 2026-10-27, planner `fallback`, thresholds hash `5c105287d4e1c479`. + +**All results in this file are SYNTHETIC (simulator output). They are not real-world accuracy.** + +## calibration split (SYNTHETIC) + +| Metric | Value (95% CI) | +|---|---| +| False-CONTRADICTED rate on authentic clips | 0.0% [0.0–18.4] (k=0, n=17) | +| VERIFIED coverage, mains-lit clips | 0.0% [0.0–19.4] (k=0, n=16) | +| Edit detection rate | 0.0% [0.0–43.4] (k=0, n=5) | +| Dropped-frame false alarms | 0.0% [0.0–79.3] (k=0, n=1) | +| Agent task success | 9.1% [2.5–27.8] (k=2, n=22) | +| Agent recovery rate | 14.3% [2.6–51.3] (k=1, n=7) | +| Human-review precision | 100.0% [20.7–100.0] (k=1, n=1) | +| Budget exhaustion rate | 0.0% [0.0–14.9] (k=0, n=22) | + +### Confusion matrix (rows: ground-truth class; columns: verdict) + +| class | VERIFIED | CONTRADICTED | INCONCLUSIVE | none | +|---|---|---|---|---| +| authentic-with-mains-light | 0 | 0 | 16 | 0 | +| authentic-without-mains-light | 0 | 0 | 1 | 0 | +| edited | 0 | 1 | 4 | 0 | +| synthetic | 0 | 0 | 0 | 0 | + +### Per condition + +| condition | n | VERIFIED | INCONCLUSIVE | CONTRADICTED | success | +|---|---|---|---|---|---| +| camera_motion | 1 | 0 | 1 | 0 | 0 | +| clean | 1 | 0 | 1 | 0 | 0 | +| clock_ppm | 1 | 0 | 1 | 0 | 0 | +| cols_axis | 1 | 0 | 1 | 0 | 0 | +| cut_0p5s | 1 | 0 | 1 | 0 | 0 | +| cut_1s | 1 | 0 | 1 | 0 | 0 | +| cut_2s | 1 | 0 | 1 | 0 | 0 | +| daylight_partial | 1 | 0 | 1 | 0 | 0 | +| dropped_frames | 1 | 0 | 1 | 0 | 0 | +| hdr | 1 | 0 | 1 | 0 | 0 | +| insert_other_time | 1 | 0 | 1 | 0 | 0 | +| jitter | 1 | 0 | 1 | 0 | 0 | +| messaging_compression | 1 | 0 | 1 | 0 | 0 | +| moving_objects | 1 | 0 | 1 | 0 | 0 | +| no_mains_light | 1 | 0 | 1 | 0 | 1 | +| no_sidecar | 1 | 0 | 1 | 0 | 0 | +| noisy | 1 | 0 | 1 | 0 | 0 | +| reorder | 1 | 0 | 0 | 1 | 1 | +| rotation_meta | 1 | 0 | 1 | 0 | 0 | +| short_readout_long_expo | 1 | 0 | 1 | 0 | 0 | +| weak_flicker | 1 | 0 | 1 | 0 | 0 | +| web_compression | 1 | 0 | 1 | 0 | 0 | + +Time error of VERIFIED clips (s): `{"n": 0}` +ENF track RMSE vs ground truth (mHz): `{"n": 16, "mean": 24.588760286265053, "median": 1.8429577821540974, "p95": 114.38792472782673, "max": 322.77616720003294}` +Edit localization error (s): `{"n": 0}` +Tool calls per job: `{"n": 22, "mean": 10.181818181818182, "median": 10.0, "p95": 12.0, "max": 12.0}` + +## Failure-case gallery (SYNTHETIC, 20 cases) + +### camera_motion__s1060 +- Condition: camera_motion; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The flicker signal was too weak in this condition. +- overlay_mp4: `camera_motion__s1060__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_enf_track: [camera_motion__s1060__enf_track.png](failure_gallery/camera_motion__s1060__enf_track.png) + +### clean__s1000 +- Condition: clean; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `clean__s1000__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [clean__s1000__phase_residual.png](failure_gallery/clean__s1000__phase_residual.png) +- plot_enf_track: [clean__s1000__enf_track.png](failure_gallery/clean__s1000__enf_track.png) + +### clock_ppm__s1110 +- Condition: clock_ppm; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `clock_ppm__s1110__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [clock_ppm__s1110__phase_residual.png](failure_gallery/clock_ppm__s1110__phase_residual.png) +- plot_enf_track: [clock_ppm__s1110__enf_track.png](failure_gallery/clock_ppm__s1110__enf_track.png) + +### cols_axis__s1120 +- Condition: cols_axis; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `cols_axis__s1120__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [cols_axis__s1120__phase_residual.png](failure_gallery/cols_axis__s1120__phase_residual.png) +- plot_enf_track: [cols_axis__s1120__enf_track.png](failure_gallery/cols_axis__s1120__enf_track.png) + +### cut_0p5s__s1160 +- Condition: cut_0p5s; expected CONTRADICTED, got INCONCLUSIVE. +- Explanation: The edit did not change the flicker phase or the matched time enough to pass the thresholds. Cuts whose length is close to a whole number of flicker periods change the phase only a little. +- overlay_mp4: `cut_0p5s__s1160__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [cut_0p5s__s1160__phase_residual.png](failure_gallery/cut_0p5s__s1160__phase_residual.png) +- plot_enf_track: [cut_0p5s__s1160__enf_track.png](failure_gallery/cut_0p5s__s1160__enf_track.png) + +### cut_1s__s1170 +- Condition: cut_1s; expected CONTRADICTED, got INCONCLUSIVE. +- Explanation: The edit did not change the flicker phase or the matched time enough to pass the thresholds. Cuts whose length is close to a whole number of flicker periods change the phase only a little. +- overlay_mp4: `cut_1s__s1170__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [cut_1s__s1170__phase_residual.png](failure_gallery/cut_1s__s1170__phase_residual.png) +- plot_enf_track: [cut_1s__s1170__enf_track.png](failure_gallery/cut_1s__s1170__enf_track.png) + +### cut_2s__s1180 +- Condition: cut_2s; expected CONTRADICTED, got INCONCLUSIVE. +- Explanation: The edit did not change the flicker phase or the matched time enough to pass the thresholds. Cuts whose length is close to a whole number of flicker periods change the phase only a little. +- overlay_mp4: `cut_2s__s1180__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [cut_2s__s1180__phase_residual.png](failure_gallery/cut_2s__s1180__phase_residual.png) +- plot_enf_track: [cut_2s__s1180__enf_track.png](failure_gallery/cut_2s__s1180__enf_track.png) + +### daylight_partial__s1150 +- Condition: daylight_partial; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The flicker signal was too weak in this condition. +- overlay_mp4: `daylight_partial__s1150__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_enf_track: [daylight_partial__s1150__enf_track.png](failure_gallery/daylight_partial__s1150__enf_track.png) + +### dropped_frames__s1050 +- Condition: dropped_frames; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `dropped_frames__s1050__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [dropped_frames__s1050__phase_residual.png](failure_gallery/dropped_frames__s1050__phase_residual.png) +- plot_enf_track: [dropped_frames__s1050__enf_track.png](failure_gallery/dropped_frames__s1050__enf_track.png) + +### hdr__s1210 +- Condition: hdr; expected VERIFIED, got INCONCLUSIVE. +- Explanation: Reasons: ['HDR_UNSUPPORTED'] + +### insert_other_time__s1190 +- Condition: insert_other_time; expected CONTRADICTED, got INCONCLUSIVE. +- Explanation: The edit did not change the flicker phase or the matched time enough to pass the thresholds. Cuts whose length is close to a whole number of flicker periods change the phase only a little. +- overlay_mp4: `insert_other_time__s1190__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [insert_other_time__s1190__phase_residual.png](failure_gallery/insert_other_time__s1190__phase_residual.png) +- plot_enf_track: [insert_other_time__s1190__enf_track.png](failure_gallery/insert_other_time__s1190__enf_track.png) + +### jitter__s1040 +- Condition: jitter; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `jitter__s1040__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [jitter__s1040__phase_residual.png](failure_gallery/jitter__s1040__phase_residual.png) +- plot_enf_track: [jitter__s1040__enf_track.png](failure_gallery/jitter__s1040__enf_track.png) + +### messaging_compression__s1100 +- Condition: messaging_compression; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The flicker signal was too weak in this condition. +- overlay_mp4: `messaging_compression__s1100__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_enf_track: [messaging_compression__s1100__enf_track.png](failure_gallery/messaging_compression__s1100__enf_track.png) + +### moving_objects__s1070 +- Condition: moving_objects; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `moving_objects__s1070__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [moving_objects__s1070__phase_residual.png](failure_gallery/moving_objects__s1070__phase_residual.png) +- plot_enf_track: [moving_objects__s1070__enf_track.png](failure_gallery/moving_objects__s1070__enf_track.png) + +### no_sidecar__s1010 +- Condition: no_sidecar; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `no_sidecar__s1010__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [no_sidecar__s1010__phase_residual.png](failure_gallery/no_sidecar__s1010__phase_residual.png) +- plot_enf_track: [no_sidecar__s1010__enf_track.png](failure_gallery/no_sidecar__s1010__enf_track.png) + +### noisy__s1080 +- Condition: noisy; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `noisy__s1080__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [noisy__s1080__phase_residual.png](failure_gallery/noisy__s1080__phase_residual.png) +- plot_enf_track: [noisy__s1080__enf_track.png](failure_gallery/noisy__s1080__enf_track.png) + +### rotation_meta__s1130 +- Condition: rotation_meta; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `rotation_meta__s1130__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [rotation_meta__s1130__phase_residual.png](failure_gallery/rotation_meta__s1130__phase_residual.png) +- plot_enf_track: [rotation_meta__s1130__enf_track.png](failure_gallery/rotation_meta__s1130__enf_track.png) + +### short_readout_long_expo__s1030 +- Condition: short_readout_long_expo; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The flicker signal was too weak in this condition. +- overlay_mp4: `short_readout_long_expo__s1030__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_enf_track: [short_readout_long_expo__s1030__enf_track.png](failure_gallery/short_readout_long_expo__s1030__enf_track.png) + +### weak_flicker__s1020 +- Condition: weak_flicker; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The flicker signal was too weak in this condition. +- overlay_mp4: `weak_flicker__s1020__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_enf_track: [weak_flicker__s1020__enf_track.png](failure_gallery/weak_flicker__s1020__enf_track.png) + +### web_compression__s1090 +- Condition: web_compression; expected VERIFIED, got INCONCLUSIVE. +- Explanation: The frequency track matched several reference times about equally well. +- overlay_mp4: `web_compression__s1090__overlay.mp4` (removed from results/ to keep the repository small: file larger than 5 MB; regenerate with eval/run_eval.py) +- plot_phase_residual: [web_compression__s1090__phase_residual.png](failure_gallery/web_compression__s1090__phase_residual.png) +- plot_enf_track: [web_compression__s1090__enf_track.png](failure_gallery/web_compression__s1090__enf_track.png) diff --git a/results/real/2026-10-27/phone1/run_meta.json b/results/real/2026-10-27/phone1/run_meta.json new file mode 100644 index 0000000..1b81c40 --- /dev/null +++ b/results/real/2026-10-27/phone1/run_meta.json @@ -0,0 +1,16 @@ +{ + "name": "real-phone1", + "video": "data/real/phone1.mov", + "sidecar": null, + "gridlog_root": "data/gridlog_empty", + "started": "2026-10-27T05:25:40.359796+00:00", + "ok": true, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED" + ], + "wall_s": 825.39, + "finished": "2026-10-27T05:39:25.756023+00:00" +} \ No newline at end of file diff --git a/results/real/2026-10-27/phone1/video_result.json b/results/real/2026-10-27/phone1/video_result.json new file mode 100644 index 0000000..545eb98 --- /dev/null +++ b/results/real/2026-10-27/phone1/video_result.json @@ -0,0 +1,98 @@ +{ + "job_id": "real-phone1", + "file_sha256": "e44a9e590a0ad7c93115ff9d61603f6f219d183f8d98916f572aa64e13bf0b2a", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": { + "zone": "unknown", + "window_start_utc": 0.0, + "window_end_utc": 0.0, + "best_offset_utc": null, + "rho1": null, + "rho2": null, + "margin": null, + "psr": null, + "track_length_s": 41.0, + "time_uncertainty_s": null, + "passes": false, + "segments": [], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": { + "status": "model_unavailable", + "label": "EXPERIMENTAL", + "ratio": null, + "significance": null, + "frames_with_faces": 0, + "anomaly": false + }, + "quality": { + "codec": "h264", + "width": 1920, + "height": 1080, + "frames": 1327, + "bitrate": 15664194, + "bits_per_pixel": 0.2518035300925926, + "transfer": "bt709", + "rotation_metadata_deg": -90, + "timestamp_source": "pts", + "jitter_p50_ms": 1.7763568394002505e-12, + "jitter_p95_ms": 7.105427357601002e-12, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 1332, + "gaps": [], + "readout_s": 0.023104273504273427, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 0.602848693419574, + "camera_motion_px": 0.5063159512727857, + "static_fraction": 0.7577595575511458, + "segmentation": "model_unavailable", + "foreground_fraction": 0.0, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 120.0, + "band_snr_db": -5.679342560599433, + "estimators_agree": true, + "dft_peak_hz": 120.00027136828103, + "phase_mean_flicker_hz": 119.99929667335002, + "patch_ids": [], + "track_samples": 41, + "verdict_rule": "S13.1", + "pdf_engine": "matplotlib" + }, + "stage_timings_s": { + "S1_ingest": 131.2886, + "S2_linear": 493.7086, + "S7_rowsignal": 21.1993, + "S3_readout": 54.2567, + "S4_motion": 22.2781, + "S5_segment": 0.0118, + "S6_patches": 31.0876, + "S8_phase": 23.7343, + "S12_face": 0.0034, + "S14_overlay": 44.9101, + "S15_report": 3.3652 + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone1\\real-phone1\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone1\\real-phone1\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone1\\real-phone1\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone1\\real-phone1\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone1\\real-phone1\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone1\\real-phone1\\band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/real/2026-10-27/phone2/run_meta.json b/results/real/2026-10-27/phone2/run_meta.json new file mode 100644 index 0000000..1b379d1 --- /dev/null +++ b/results/real/2026-10-27/phone2/run_meta.json @@ -0,0 +1,16 @@ +{ + "name": "real-phone2", + "video": "data/real/phone2.mov", + "sidecar": null, + "gridlog_root": "data/gridlog_empty", + "started": "2026-10-27T05:25:40.359796+00:00", + "ok": true, + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED" + ], + "wall_s": 809.54, + "finished": "2026-10-27T05:39:09.900890+00:00" +} \ No newline at end of file diff --git a/results/real/2026-10-27/phone2/video_result.json b/results/real/2026-10-27/phone2/video_result.json new file mode 100644 index 0000000..bc3744c --- /dev/null +++ b/results/real/2026-10-27/phone2/video_result.json @@ -0,0 +1,98 @@ +{ + "job_id": "real-phone2", + "file_sha256": "db19aa5e172de1fe3c402ac5606c47090df0d20110bca8fdc9f0bd3ac423770d", + "engine_version": "0.1.0", + "config_hash": "8f439372b865ee8e", + "thresholds_hash": "0161b96f77d3e925", + "verdict": "INCONCLUSIVE", + "lifecycle_state": "FINAL", + "reasons": [ + "SIGNAL_ABSENT", + "READOUT_ESTIMATED" + ], + "time_estimate_utc": null, + "time_estimate_iso": null, + "time_uncertainty_s": null, + "zone": null, + "match": { + "zone": "unknown", + "window_start_utc": 0.0, + "window_end_utc": 0.0, + "best_offset_utc": null, + "rho1": null, + "rho2": null, + "margin": null, + "psr": null, + "track_length_s": 41.0, + "time_uncertainty_s": null, + "passes": false, + "segments": [], + "segments_consistent": null + }, + "continuity_events": [], + "face_region": { + "status": "model_unavailable", + "label": "EXPERIMENTAL", + "ratio": null, + "significance": null, + "frames_with_faces": 0, + "anomaly": false + }, + "quality": { + "codec": "h264", + "width": 1920, + "height": 1080, + "frames": 1323, + "bitrate": 15315769, + "bits_per_pixel": 0.24620256237139918, + "transfer": "bt709", + "rotation_metadata_deg": 0, + "timestamp_source": "pts", + "jitter_p50_ms": 7.105427357601002e-12, + "jitter_p95_ms": 1.7541523789077473e-11, + "timing_assumption": "pts_is_first_row_exposure_start", + "opencv_frame_count": 1323, + "gaps": [], + "readout_s": 0.02182564102564095, + "readout_source": "READOUT_ESTIMATED", + "motion_level_px": 1.0034721700444065, + "camera_motion_px": 0.7509880052698511, + "static_fraction": 0.5947295096021948, + "segmentation": "model_unavailable", + "foreground_fraction": 0.0, + "track_id": "t1", + "axis": "rows+", + "nominal_flicker_hz": 100.0, + "band_snr_db": -5.60130983317978, + "estimators_agree": false, + "dft_peak_hz": 99.99574165851568, + "phase_mean_flicker_hz": 94.27505552763076, + "patch_ids": [], + "track_samples": 41, + "verdict_rule": "S13.1", + "pdf_engine": "matplotlib" + }, + "stage_timings_s": { + "S1_ingest": 124.7906, + "S2_linear": 486.2014, + "S7_rowsignal": 19.8177, + "S3_readout": 53.6966, + "S4_motion": 21.4347, + "S5_segment": 0.004, + "S6_patches": 31.7217, + "S8_phase": 18.0314, + "S12_face": 0.003, + "S14_overlay": 49.8085, + "S15_report": 5.6605 + }, + "artifacts": { + "overlay_mp4": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone2\\real-phone2\\overlay.mp4", + "report_html": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone2\\real-phone2\\report.html", + "report_pdf": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone2\\real-phone2\\report.pdf", + "report_json": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone2\\real-phone2\\result.json", + "plot_enf_track": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone2\\real-phone2\\enf_track.png", + "plot_band_amplitude": "D:\\Open-cv\\.worktrees\\docs\\results\\video\\engine_runs\\real-phone2\\real-phone2\\band_amplitude.png" + }, + "reviewer": null, + "notes": [] +} \ No newline at end of file diff --git a/results/video/duration.json b/results/video/duration.json new file mode 100644 index 0000000..ed60261 --- /dev/null +++ b/results/video/duration.json @@ -0,0 +1,8 @@ +{ + "file": "gridprint_submission.mp4", + "sha256": "58a9b27aaf043511cd3a3b179575b8263b2956375897c00b4a52a095e98f0e8b", + "duration_s": 195.433333, + "limit_s": 300, + "ok": true, + "checked": "2026-10-27T05:24:38.693595+00:00" +} \ No newline at end of file diff --git a/results/video/gridprint_submission.srt b/results/video/gridprint_submission.srt new file mode 100644 index 0000000..3db3c85 --- /dev/null +++ b/results/video/gridprint_submission.srt @@ -0,0 +1,196 @@ +1 +00:00:00,400 --> 00:00:03,882 +Today, anyone can generate a realistic video in minutes. + +2 +00:00:04,302 --> 00:00:06,509 +It costs almost nothing, and it looks real. + +3 +00:00:07,509 --> 00:00:08,789 +This creates a second problem. + +4 +00:00:09,209 --> 00:00:12,708 +When a video is real, people now say: it is just AI. + +5 +00:00:13,128 --> 00:00:14,865 +True evidence loses its value. + +6 +00:00:15,865 --> 00:00:19,185 +We need a fact from the physical world that a generator does not know. + +7 +00:00:19,605 --> 00:00:21,802 +There is one, and it hangs above your head. + +8 +00:00:22,222 --> 00:00:23,913 +Mains lights flicker with the power grid. + +9 +00:00:24,333 --> 00:00:28,769 +The grid frequency drifts a little, all the time, and that drift marks the time. + +10 +00:00:29,769 --> 00:00:31,169 +This problem hurts real people. + +11 +00:00:31,589 --> 00:00:34,144 +Newsrooms must check footage before they publish it. + +12 +00:00:34,564 --> 00:00:36,642 +Courts must decide which video to trust. + +13 +00:00:37,062 --> 00:00:39,238 +Insurers must check claims that use video. + +14 +00:00:39,658 --> 00:00:43,233 +Human-rights groups must defend footage that powerful people call AI. + +15 +00:00:44,233 --> 00:00:47,431 +Meet GRIDPRINT. It checks a video against the power grid. + +16 +00:00:47,851 --> 00:00:50,554 +A mains light flickers at two times the grid frequency. + +17 +00:00:50,974 --> 00:00:54,541 +On a fifty hertz grid, that is one hundred pulses each second. + +18 +00:00:55,541 --> 00:00:58,213 +A phone camera reads its sensor one row at a time. + +19 +00:00:58,633 --> 00:00:59,901 +This is called a rolling shutter. + +20 +00:01:00,321 --> 00:01:03,689 +So the fast flicker becomes faint horizontal bands in the image. + +21 +00:01:04,689 --> 00:01:07,301 +This is a public clip of a real fluorescent light. + +22 +00:01:07,721 --> 00:01:13,796 +OpenCV 5 linearises the light, removes camera motion, and measures the bands in each frame. + +23 +00:01:14,796 --> 00:01:18,542 +From the band phase, the engine rebuilds the grid frequency track. + +24 +00:01:18,962 --> 00:01:21,443 +Then it slides that track along the grid reference log. + +25 +00:01:21,863 --> 00:01:26,494 +One clear match gives a recording time. A cut or an insertion breaks the match. + +26 +00:01:27,494 --> 00:01:31,284 +GRIDPRINT runs live on AWS today. This is the web app. + +27 +00:01:31,704 --> 00:01:35,764 +You upload a video. You can add a claimed grid zone and a claimed recording time. + +28 +00:01:36,764 --> 00:01:39,953 +Ready-made example cases run through the same live pipeline. + +29 +00:01:40,373 --> 00:01:42,321 +One click starts a full analysis job. + +30 +00:01:43,321 --> 00:01:47,573 +Here is a finished job. The verdict is VERIFIED, and the report is final. + +31 +00:01:47,993 --> 00:01:51,500 +The page shows the estimated recording time and its uncertainty. + +32 +00:01:51,920 --> 00:01:54,722 +Each verdict comes with reason codes in plain words. + +33 +00:01:55,722 --> 00:01:57,659 +An agent plans each analysis. + +34 +00:01:58,079 --> 00:02:02,353 +It calls engine tools through an MCP server, and it logs every step. + +35 +00:02:03,353 --> 00:02:06,252 +A CONTRADICTED result is never final on its own. + +36 +00:02:06,672 --> 00:02:08,781 +A human reviewer must approve it first. + +37 +00:02:09,781 --> 00:02:13,295 +The limitations page tells users what GRIDPRINT cannot do. + +38 +00:02:13,715 --> 00:02:15,254 +Clear limits are part of the product. + +39 +00:02:16,254 --> 00:02:19,867 +A video arrives through API Gateway and a load balancer. + +40 +00:02:20,287 --> 00:02:27,030 +An API service on Fargate stores it in S3 with KMS keys, and puts a job on an SQS queue. + +41 +00:02:27,450 --> 00:02:32,542 +Workers on Graviton4 run the OpenCV 5 engine in fifteen stages. + +42 +00:02:32,962 --> 00:02:40,429 +An agent with twelve MCP tools uses Amazon Nova Lite on Bedrock to plan each run, inside strict policies. + +43 +00:02:40,849 --> 00:02:47,867 +DynamoDB keeps jobs and the grid log. IoT Core brings in grid data. Cognito signs in reviewers. + +44 +00:02:48,867 --> 00:02:52,443 +We measured the same engine on Graviton and on x86. + +45 +00:02:52,863 --> 00:02:57,478 +Graviton processed more video per second, at a lower cost per video hour. + +46 +00:02:58,478 --> 00:03:04,149 +GRIDPRINT gives exactly three verdicts: VERIFIED, CONTRADICTED, or INCONCLUSIVE. + +47 +00:03:04,569 --> 00:03:06,830 +A missing signal never counts against a video. + +48 +00:03:07,250 --> 00:03:10,866 +It needs mains lighting, and many phone videos will be INCONCLUSIVE. + +49 +00:03:11,286 --> 00:03:13,837 +GRIDPRINT. Evidence from the light in the room. + diff --git a/scripts/collect_aws_runs.py b/scripts/collect_aws_runs.py new file mode 100644 index 0000000..5c4d6ce --- /dev/null +++ b/scripts/collect_aws_runs.py @@ -0,0 +1,45 @@ +"""Copy finished AWS job evidence (result, trace, report, plots) from the results bucket into results/aws// +and write results/aws/index.json. Uses the `gridprint` profile only.""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path + +import boto3 +import yaml + +REPO = Path(__file__).resolve().parents[1] +KEEP = (".json", ".html", ".pdf", ".png") + + +def main(prefixes: list[str]) -> int: + cfg = yaml.safe_load((REPO / "config" / "default.yaml").read_text()) + s = boto3.Session(profile_name=cfg["aws"]["profile"], region_name=cfg["aws"]["region"]) + bucket = next(b["Name"] for b in s.client("s3").list_buckets()["Buckets"] if "results" in b["Name"] + and b["Name"].startswith(cfg["aws"].get("resource_prefix", "gridprint"))) + s3 = s.client("s3") + out = REPO / "results" / "aws" + index = [] + pages = s3.get_paginator("list_objects_v2").paginate(Bucket=bucket, Prefix="jobs/") + keys = [o["Key"] for p in pages for o in p.get("Contents", [])] + jobs = sorted({k.split("/")[1] for k in keys if any(k.split("/")[1].startswith(x) for x in prefixes)}) + for j in jobs: + d = out / j + d.mkdir(parents=True, exist_ok=True) + for k in keys: + if k.startswith(f"jobs/{j}/") and k.endswith(KEEP) and not k.endswith("sidecar.json"): + s3.download_file(bucket, k, str(d / Path(k).name)) + r = json.loads((d / "result.json").read_text()) if (d / "result.json").exists() else {} + index.append({"job_id": j, "verdict": r.get("verdict"), "lifecycle_state": r.get("lifecycle_state"), + "reasons": r.get("reasons"), "time_estimate_iso": r.get("time_estimate_iso"), + "band_snr_db": (r.get("quality") or {}).get("band_snr_db"), + "stage_timings_s": r.get("stage_timings_s")}) + (out / "index.json").write_text(json.dumps(index, indent=1)) + print(json.dumps(index, indent=1)[:3000]) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:] or ["aws3-", "aws4-"])) diff --git a/video/assets/live/guide.png b/video/assets/live/guide.png new file mode 100644 index 0000000..06ee62d Binary files /dev/null and b/video/assets/live/guide.png differ diff --git a/video/assets/live/home.png b/video/assets/live/home.png new file mode 100644 index 0000000..d452327 Binary files /dev/null and b/video/assets/live/home.png differ diff --git a/video/assets/live/job.png b/video/assets/live/job.png new file mode 100644 index 0000000..4b72372 Binary files /dev/null and b/video/assets/live/job.png differ diff --git a/video/assets/live/jobcut.png b/video/assets/live/jobcut.png new file mode 100644 index 0000000..95d871d Binary files /dev/null and b/video/assets/live/jobcut.png differ diff --git a/video/assets/live/limits.png b/video/assets/live/limits.png new file mode 100644 index 0000000..eb71796 Binary files /dev/null and b/video/assets/live/limits.png differ diff --git a/video/assets/live/reviewer.png b/video/assets/live/reviewer.png new file mode 100644 index 0000000..f5cd998 Binary files /dev/null and b/video/assets/live/reviewer.png differ diff --git a/video/assets/ui_home.jpg b/video/assets/ui_home.jpg new file mode 100644 index 0000000..791ab3d Binary files /dev/null and b/video/assets/ui_home.jpg differ diff --git a/video/assets/ui_home.png b/video/assets/ui_home.png new file mode 100644 index 0000000..065e77a Binary files /dev/null and b/video/assets/ui_home.png differ diff --git a/video/assets/ui_job.png b/video/assets/ui_job.png new file mode 100644 index 0000000..d3de9d9 Binary files /dev/null and b/video/assets/ui_job.png differ diff --git a/video/assets/ui_limitations.png b/video/assets/ui_limitations.png new file mode 100644 index 0000000..ab649d0 Binary files /dev/null and b/video/assets/ui_limitations.png differ diff --git a/video/assets/ui_reviewer.png b/video/assets/ui_reviewer.png new file mode 100644 index 0000000..76b850e Binary files /dev/null and b/video/assets/ui_reviewer.png differ diff --git a/video/assets/ui_trace.png b/video/assets/ui_trace.png new file mode 100644 index 0000000..d1fed33 Binary files /dev/null and b/video/assets/ui_trace.png differ diff --git a/video/make_pitch.py b/video/make_pitch.py new file mode 100644 index 0000000..48d3ad7 --- /dev/null +++ b/video/make_pitch.py @@ -0,0 +1,816 @@ +"""GRIDPRINT pitch video generator (v2, narrated, motion graphics). + +Run from the repository root: + PYTHONUTF8=1 PYTHONPATH=".;engine" python video/make_pitch.py + +Inputs (all real files): video/assets/live/*.png (headless-Chrome screenshots of the live AWS app), +data/public/fluorescent_beat_effect.mp4 (Wikimedia Commons, CC BY-SA 3.0), results/video/engine_runs/* (engine output), +results/agent_traces/*.json (agent trace), results/bench/2026-10-27/{cost.json,A,B/summary.json} (benchmark). +Outputs: results/video/gridprint_submission.mp4, .srt, docs/VIDEO_SCRIPT.md. +TTS: edge-tts (en-US-AndrewNeural). Every number on screen is read from a results/ file at build time. +""" + +from __future__ import annotations + +import asyncio +import hashlib +import json +import math +import subprocess +import sys +import wave +from pathlib import Path + +import cv2 +import numpy as np +from PIL import Image, ImageDraw, ImageFont + +ROOT = Path(__file__).resolve().parents[1] +OUT = ROOT / "results" / "video" +BUILD = OUT / "build" / "pitch" +TTS_DIR = BUILD / "tts" +LIVE = ROOT / "video" / "assets" / "live" +RUNS = OUT / "engine_runs" +BENCH = ROOT / "results" / "bench" / "2026-10-27" +PUBLIC_CLIP = ROOT / "data" / "public" / "fluorescent_beat_effect.mp4" +APP_URL = "5u7suz00bi.execute-api.us-east-1.amazonaws.com" +REPO = "github.com/vivekyarra/Alibi" +VOICE, RATE = "en-US-AndrewNeural", "+0%" +W, H, FPS, SR = 1920, 1080, 30, 48000 +GAP, LEAD, TAIL = 0.42, 0.4, 0.6 + +BG0, BG1 = np.array([9, 14, 20], np.float32), np.array([10, 30, 34], np.float32) +FG, MUTED, ACC = (238, 242, 246), (140, 156, 170), (70, 225, 160) +PANEL, LINE = (20, 30, 38), (44, 62, 72) +VCOL = {"VERIFIED": (52, 190, 110), "CONTRADICTED": (225, 70, 70), "INCONCLUSIVE": (150, 160, 172)} +FD = Path("C:/Windows/Fonts") +_FC: dict = {} + + +def F(size: int, kind: str = "b") -> ImageFont.FreeTypeFont: + k = (size, kind) + if k not in _FC: + name = {"b": "segoeuib.ttf", "r": "segoeui.ttf", "l": "segoeuil.ttf", "m": "consola.ttf", "s": "seguisym.ttf"}[kind] + _FC[k] = ImageFont.truetype(str(FD / name), size) + return _FC[k] + + +def ease(x: float) -> float: + x = min(1.0, max(0.0, x)) + return x * x * (3 - 2 * x) + + +def lerp(a, b, u): + return a + (b - a) * u + + +# ----------------------------------------------------------------------------- narration (ASD-STE100 style) +SECTIONS = [ + ("01", "THE PROBLEM", [ + ("hook", ["Today, anyone can generate a realistic video in minutes.", + "It costs almost nothing, and it looks real."]), + ("dismiss", ["This creates a second problem.", + "When a video is real, people now say: it is just AI.", + "True evidence loses its value."]), + ("bulb", ["We need a fact from the physical world that a generator does not know.", + "There is one, and it hangs above your head.", + "Mains lights flicker with the power grid.", + "The grid frequency drifts a little, all the time, and that drift marks the time."]), + ]), + ("02", "WHO NEEDS THIS", [ + ("pain", ["This problem hurts real people.", + "Newsrooms must check footage before they publish it.", + "Courts must decide which video to trust.", + "Insurers must check claims that use video.", + "Human-rights groups must defend footage that powerful people call AI."]), + ]), + ("03", "HOW IT WORKS", [ + ("flicker", ["Meet GRIDPRINT. It checks a video against the power grid.", + "A mains light flickers at two times the grid frequency.", + "On a fifty hertz grid, that is one hundred pulses each second."]), + ("rolling", ["A phone camera reads its sensor one row at a time.", + "This is called a rolling shutter.", + "So the fast flicker becomes faint horizontal bands in the image."]), + ("overlay", ["This is a public clip of a real fluorescent light.", + "OpenCV 5 linearises the light, removes camera motion, and measures the bands in each frame."]), + ("track", ["From the band phase, the engine rebuilds the grid frequency track.", + "Then it slides that track along the grid reference log.", + "One clear match gives a recording time. A cut or an insertion breaks the match."]), + ]), + ("04", "THE PRODUCT", [ + ("home", ["GRIDPRINT runs live on AWS today. This is the web app.", + "You upload a video. You can add a claimed grid zone and a claimed recording time."]), + ("cases", ["Ready-made example cases run through the same live pipeline.", + "One click starts a full analysis job."]), + ("job", ["Here is a finished job. The verdict is VERIFIED, and the report is final.", + "The page shows the estimated recording time and its uncertainty.", + "Each verdict comes with reason codes in plain words."]), + ("trace", ["An agent plans each analysis.", + "It calls engine tools through an MCP server, and it logs every step."]), + ("reviewer", ["A CONTRADICTED result is never final on its own.", + "A human reviewer must approve it first."]), + ("limits", ["The limitations page tells users what GRIDPRINT cannot do.", + "Clear limits are part of the product."]), + ]), + ("05", "BUILT ON AWS", [ + ("arch", ["A video arrives through API Gateway and a load balancer.", + "An API service on Fargate stores it in S3 with KMS keys, and puts a job on an SQS queue.", + "Workers on Graviton4 run the OpenCV 5 engine in fifteen stages.", + "An agent with twelve MCP tools uses Amazon Nova Lite on Bedrock to plan each run, inside strict policies.", + "DynamoDB keeps jobs and the grid log. IoT Core brings in grid data. Cognito signs in reviewers."]), + ("bench", ["We measured the same engine on Graviton and on x86.", + "Graviton processed more video per second, at a lower cost per video hour."]), + ]), + ("06", "THE VERDICT", [ + ("close", ["GRIDPRINT gives exactly three verdicts: VERIFIED, CONTRADICTED, or INCONCLUSIVE.", + "A missing signal never counts against a video.", + "It needs mains lighting, and many phone videos will be INCONCLUSIVE.", + "GRIDPRINT. Evidence from the light in the room."]), + ]), +] + + +# ----------------------------------------------------------------------------- TTS +async def _tts_one(text: str, mp3: Path, sem: asyncio.Semaphore) -> None: + import edge_tts + async with sem: + for attempt in range(4): + try: + await edge_tts.Communicate(text, VOICE, rate=RATE).save(str(mp3)) + return + except Exception as e: # network hiccup + print("tts retry", attempt, e) + await asyncio.sleep(2) + raise RuntimeError(f"tts failed: {text}") + + +def tts_all(sentences: list[str]) -> list[np.ndarray]: + TTS_DIR.mkdir(parents=True, exist_ok=True) + jobs, paths = [], [] + for s in sentences: + h = hashlib.sha1(f"{VOICE}|{RATE}|{s}".encode()).hexdigest()[:16] + mp3, wav = TTS_DIR / f"{h}.mp3", TTS_DIR / f"{h}.wav" + paths.append((mp3, wav)) + if not wav.exists(): + jobs.append((s, mp3)) + + async def run(): + sem = asyncio.Semaphore(6) + await asyncio.gather(*[_tts_one(s, m, sem) for s, m in jobs]) + if jobs: + asyncio.run(run()) + out = [] + for mp3, wav in paths: + if not wav.exists(): + subprocess.run(["ffmpeg", "-v", "error", "-y", "-i", str(mp3), "-af", + "silenceremove=start_periods=1:start_threshold=-50dB,areverse,silenceremove=start_periods=1:start_threshold=-50dB,areverse", + "-ac", "1", "-ar", str(SR), str(wav)], check=True) + with wave.open(str(wav)) as w: + a = np.frombuffer(w.readframes(w.getnframes()), np.int16).astype(np.float32) / 32768 + out.append(a) + return out + + +# ----------------------------------------------------------------------------- media helpers +def load_frames(p: Path, size: tuple[int, int] | None = None, maxn: int = 900) -> list[np.ndarray]: + cap, fr = cv2.VideoCapture(str(p)), [] + while len(fr) < maxn: + ok, f = cap.read() + if not ok: + break + f = cv2.cvtColor(f, cv2.COLOR_BGR2RGB) + fr.append(cv2.resize(f, size, interpolation=cv2.INTER_AREA) if size else f) + return fr + + +_BG = None + + +def background() -> Image.Image: + global _BG + if _BG is None: + yy, xx = np.mgrid[0:H, 0:W].astype(np.float32) + u = np.clip((xx / W) * 0.6 + (yy / H) * 0.4, 0, 1)[..., None] + r = np.exp(-(((xx - W * 0.75) / 900) ** 2 + ((yy - H * 0.2) / 600) ** 2))[..., None] + a = BG0 * (1 - u) + BG1 * u + r * np.array([0, 18, 14], np.float32) + g = np.zeros((H, W), np.float32) + g[::60, :] = 1 + g[:, ::60] = 1 + a += g[..., None] * 4 + _BG = Image.fromarray(np.clip(a, 0, 255).astype(np.uint8)) + return _BG.copy() + + +def rrect(d: ImageDraw.ImageDraw, box, fill=PANEL, outline=LINE, r=18, width=2): + d.rounded_rectangle(box, r, fill=fill, outline=outline, width=width) + + +def ctext(d, xy, text, font, fill=FG, anchor="mm"): + d.text(xy, text, font=font, fill=fill, anchor=anchor) + + +def alpha_text(img, xy, text, font, fill, a, anchor="la"): + if a <= 0.01: + return + lay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + ImageDraw.Draw(lay).text(xy, text, font=font, fill=fill + (int(255 * min(1, a)),), anchor=anchor) + img.alpha_composite(lay) + + +def paste_np(img: Image.Image, arr: np.ndarray, box, border=True): + x0, y0, x1, y1 = box + im = Image.fromarray(arr).resize((x1 - x0, y1 - y0), Image.BILINEAR) + img.paste(im, (x0, y0)) + if border: + ImageDraw.Draw(img).rounded_rectangle((x0 - 2, y0 - 2, x1 + 2, y1 + 2), 6, outline=LINE, width=3) + + +def tagline(d, num, title): + rrect(d, (64, 44, 104, 72), fill=(18, 60, 46), outline=ACC, r=6, width=1) + ctext(d, (84, 58), num, F(18, "b"), ACC) + d.line((116, 58, 156, 58), fill=ACC, width=2) + d.text((168, 58), title, font=F(20, "b"), fill=ACC, anchor="lm") + + +def source_tag(d, text, y=900): + d.text((W - 64, y), text, font=F(18, "m"), fill=MUTED, anchor="rm") + + +def caption(img: Image.Image, text: str): + d = ImageDraw.Draw(img) + f = F(38, "b") + words, lines, cur = text.split(), [], "" + for w_ in words: + t = (cur + " " + w_).strip() + if d.textlength(t, font=f) > 1500 and cur: + lines.append(cur) + cur = w_ + else: + cur = t + lines.append(cur) + lh = 50 + y0 = 1032 - lh * len(lines) + wmax = max(d.textlength(l_, font=f) for l_ in lines) + lay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + ImageDraw.Draw(lay).rounded_rectangle((W / 2 - wmax / 2 - 28, y0 - 14, W / 2 + wmax / 2 + 28, y0 + lh * len(lines) + 8), + 14, fill=(6, 10, 14, 200)) + img.alpha_composite(lay) + for i, l_ in enumerate(lines): + d.text((W / 2, y0 + i * lh), l_, font=f, fill=FG, anchor="ma") + + +# ----------------------------------------------------------------------------- scene visuals +class Ctx: + pass + + +def heading(img, d, text, t, y=150, size=72, x=110, delay=0.0, color=FG): + a = ease((t - delay) / 0.6) + alpha_text(img, (x, y + (1 - a) * 30), text, F(size, "b"), color, a) + + +def v_hook(img, d, t, D, c): + # 3D perspective "frame wall": many video frames flying toward the camera + rng = np.random.default_rng(3) + pts = rng.uniform(-1, 1, (70, 2)) * [9, 4] + zs = (rng.uniform(0, 1, 70) + t * 0.12) % 1.0 + order = np.argsort(-zs) + for i in order: + z = 6 - zs[i] * 5.5 + s = 520 / z + cx, cy = W * 0.62 + pts[i, 0] * s * 0.6, H * 0.46 + pts[i, 1] * s * 0.6 + w_, h_ = 1.6 * s * 0.5, 0.9 * s * 0.5 + a = min(1, zs[i] * 2.2) * (1 - zs[i]) * 2 + col = tuple(int(v * min(1, a)) for v in (60, 120, 130)) + d.rectangle((cx - w_ / 2, cy - h_ / 2, cx + w_ / 2, cy + h_ / 2), outline=col, width=2) + d.polygon([(cx - 8 * s / 100, cy - 10 * s / 100), (cx - 8 * s / 100, cy + 10 * s / 100), (cx + 10 * s / 100, cy)], + fill=col) + heading(img, d, "Realistic video.", t, 300, 96) + heading(img, d, "Generated in minutes.", t, 410, 96, delay=0.6, color=ACC) + t2 = c.sent_t[1] if len(c.sent_t) > 1 else 3 + heading(img, d, "Almost free.", t, 520, 96, delay=t2) + + +def v_dismiss(img, d, t, D, c): + fr = c.clip[int(t * 30) % len(c.clip)] + box = (1000, 170, 1000 + 760, 170 + 570) + paste_np(img, fr, box) + d.text((1000, 755), "Real footage: \u201cFluorescent beat effect\u201d, Wikimedia Commons, CC BY-SA 3.0", + font=F(18, "r"), fill=MUTED) + t1 = c.sent_t[1] + if t > t1: + a = ease((t - t1) / 0.35) + sc = 1.6 - 0.6 * a + lay = Image.new("RGBA", (620, 170), (0, 0, 0, 0)) + ld = ImageDraw.Draw(lay) + ld.rounded_rectangle((8, 8, 612, 162), 16, outline=(235, 80, 80, 255), width=8) + ld.text((310, 85), "\u201cIt's just AI.\u201d", font=F(70, "b"), fill=(235, 80, 80, 255), anchor="mm") + lay = lay.resize((int(620 * sc), int(170 * sc))).rotate(-8, expand=True) + lay.putalpha(lay.getchannel("A").point(lambda v: int(v * a))) + img.alpha_composite(lay, (int(1380 - lay.width / 2), int(455 - lay.height / 2))) + heading(img, d, "Real video,", t, 300, 92) + heading(img, d, "dismissed as AI.", t, 410, 92, delay=0.5, color=(235, 90, 90)) + if len(c.sent_t) > 2: + heading(img, d, "Evidence loses its value.", t, 560, 46, delay=c.sent_t[2], color=MUTED) + + +def bulb(img, d, cx, cy, r, level): + glow = Image.new("RGBA", (r * 8, r * 8), (0, 0, 0, 0)) + gd = ImageDraw.Draw(glow) + for k in range(10, 0, -1): + rr = r * (1 + k * 0.28) + gd.ellipse((r * 4 - rr, r * 4 - rr, r * 4 + rr, r * 4 + rr), fill=(255, 220, 140, int(10 * level))) + img.alpha_composite(glow, (int(cx - r * 4), int(cy - r * 4))) + v = int(120 + 135 * level) + d.ellipse((cx - r, cy - r, cx + r, cy + r), fill=(v, int(v * 0.9), int(v * 0.6)), outline=(255, 240, 200), width=3) + d.rounded_rectangle((cx - r * 0.45, cy + r * 0.8, cx + r * 0.45, cy + r * 1.5), 6, fill=(150, 156, 160)) + for k in range(3): + yk = cy + r * (0.95 + k * 0.18) + d.line((cx - r * 0.45, yk, cx + r * 0.45, yk), fill=(100, 106, 110), width=3) + + +def helix(d, t, x0, x1, ycen, amp, cycles, rot, col, width=4, power=False): + # 3D sine ribbon rotating around the time axis, projected with perspective + n = 420 + xs = np.linspace(0, 1, n) + ph = 2 * np.pi * cycles * xs - t * 3 + y3, z3 = np.sin(ph) * amp, np.cos(ph) * amp * 0.0 + if power: + y3 = np.abs(np.sin(ph)) * amp * 1.4 - amp * 0.7 + yr = y3 * math.cos(rot) - z3 * math.sin(rot) + zr = y3 * math.sin(rot) + z3 * math.cos(rot) + persp = 900 / (900 + zr) + X = x0 + xs * (x1 - x0) + Y = ycen + yr * persp + d.line(list(zip(X.tolist(), Y.tolist())), fill=col, width=width, joint="curve") + + +def v_bulb(img, d, t, D, c): + s2 = c.sent_t[2] if len(c.sent_t) > 2 else 0 + lvl = 0.55 + 0.45 * abs(math.sin(t * 2 * math.pi * 1.2)) if t > s2 else 0.85 + bulb(img, d, 520, 420, 120, lvl) + rot = t * 0.6 + if t > s2: + a = ease((t - s2) / 0.8) + x1 = 900 + 900 * a + helix(d, t, 900, x1, 330, 90, 4, rot, ACC, 5) + d.text((900, 210), "Grid voltage \u00b7 50 or 60 Hz", font=F(30, "b"), fill=ACC) + helix(d, t, 900, x1, 600, 90, 8, rot, (255, 210, 120), 4, power=True) + d.text((900, 480), "Light output \u00b7 flickers at 2\u00d7 grid frequency", font=F(30, "b"), fill=(255, 210, 120)) + else: + heading(img, d, "A clock in every room.", t, 300, 76, x=900) + heading(img, d, "The power grid.", t, 400, 76, x=900, delay=c.sent_t[1] if len(c.sent_t) > 1 else 1, color=ACC) + if len(c.sent_t) > 3 and t > c.sent_t[3]: + heading(img, d, "Frequency drifts \u2192 a timestamp in the light.", t, 760, 40, x=900, delay=c.sent_t[3], color=FG) + + +def v_pain(img, d, t, D, c): + fr = c.clip_blur[int(t * 30) % len(c.clip_blur)] + img.paste(Image.fromarray(fr), (0, 0)) + heading(img, d, "Real footage needs a defence.", t, 130, 64) + items = [("Newsrooms", "verify footage before publishing", "\u2709"), + ("Courts", "decide which video to trust", "\u2696"), + ("Insurers", "check claims that use video", "\u2602"), + ("Human-rights groups", "defend footage called \u201cAI\u201d", "\u270A")] + for i, (a_, b_, ic) in enumerate(items): + st = c.sent_t[i + 1] if len(c.sent_t) > i + 1 else i + a = ease((t - st) / 0.5) + if a <= 0: + continue + x = 110 + i * 435 + y = 330 + (1 - a) * 60 + lay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + ld = ImageDraw.Draw(lay) + ld.rounded_rectangle((x, y, x + 400, y + 380), 20, fill=(16, 26, 32, int(225 * a)), outline=ACC + (int(255 * a),), width=2) + ld.text((x + 40, y + 50), ic, font=F(90, "s"), fill=ACC + (int(255 * a),)) + ld.text((x + 40, y + 200), a_, font=F(38, "b"), fill=FG + (int(255 * a),)) + ld.text((x + 40, y + 260), b_, font=F(25, "r"), fill=MUTED + (int(255 * a),)) + img.alpha_composite(lay) + d.text((110, 820), "Background: \u201cFluorescent beat effect\u201d, Wikimedia Commons, CC BY-SA 3.0", font=F(18, "r"), fill=MUTED) + + +def v_flicker(img, d, t, D, c): + heading(img, d, "GRIDPRINT", t, 120, 110, color=ACC) + heading(img, d, "checks a video against the power grid.", t, 250, 44, delay=0.3) + s1 = c.sent_t[1] if len(c.sent_t) > 1 else 2 + if t > s1: + a = ease((t - s1) / 0.8) + x0, x1 = 160, 160 + 1600 * a + d.line((160, 520, 1760, 520), fill=LINE, width=2) + d.line((160, 760, 1760, 760), fill=LINE, width=2) + helix(d, t * 0.5, x0, x1, 520, 80, 5, t * 0.4, ACC, 5) + helix(d, t * 0.5, x0, x1, 760, 80, 10, t * 0.4, (255, 210, 120), 4, power=True) + d.text((160, 410), "Grid: 50 Hz", font=F(30, "b"), fill=ACC) + d.text((160, 650), "Light: 100 pulses per second", font=F(30, "b"), fill=(255, 210, 120)) + lvl = 0.5 + 0.5 * abs(math.sin(t * 7)) + bulb(img, d, 1700, 380, 50, lvl) + + +def v_rolling(img, d, t, D, c): + # sensor rows read one at a time; each row samples the flicker at its own readout time + heading(img, d, "Rolling shutter", t, 120, 72) + heading(img, d, "turns flicker into bands.", t, 210, 48, delay=0.4, color=ACC) + x0, y0, w_, h_ = 980, 150, 760, 700 + rows = 70 + prog = ((t * 0.35) % 1.0) + cur = int(prog * rows) + full = t > (c.sent_t[2] if len(c.sent_t) > 2 else D * 0.6) + rrect(d, (x0 - 14, y0 - 14, x0 + w_ + 14, y0 + h_ + 14), fill=(12, 18, 22)) + rh = h_ / rows + for r in range(rows): + if r > cur and not full: + continue + v = 0.5 + 0.5 * abs(math.sin(2 * math.pi * 3.3 * r / rows + t * 0.8)) + g = int(70 + 120 * v) + d.rectangle((x0, y0 + r * rh, x0 + w_, y0 + (r + 1) * rh), fill=(g, int(g * 0.95), int(g * 0.8))) + if not full: + yy = y0 + cur * rh + d.rectangle((x0 - 20, yy - 3, x0 + w_ + 20, yy + 3), fill=ACC) + d.text((x0 - 30, yy), "reading row", font=F(22, "b"), fill=ACC, anchor="rm") + d.text((x0, y0 + h_ + 30), "Each row is read a little later \u2192 it sees a different moment of the flicker.", + font=F(24, "r"), fill=MUTED) + bulb(img, d, 400, 560, 90, 0.5 + 0.5 * abs(math.sin(t * 9))) + d.line((520, 560, x0 - 40, 560), fill=(255, 210, 120), width=3) + for k in range(5): + px = 520 + ((t * 260 + k * 90) % (x0 - 560)) + d.ellipse((px - 6, 554, px + 6, 566), fill=(255, 220, 140)) + + +def v_overlay(img, d, t, D, c): + heading(img, d, "Real light. Real measurement.", t, 100, 60) + i = int(t * 30) % len(c.clip) + paste_np(img, c.clip[i], (120, 260, 120 + 800, 260 + 600)) + paste_np(img, c.ovl[i % len(c.ovl)], (1000, 260, 1000 + 800, 260 + 655)) + d.text((120, 225), "Input: public clip of a fluorescent light", font=F(24, "b"), fill=FG) + d.text((1000, 225), "OpenCV 5 engine overlay (engine output)", font=F(24, "b"), fill=ACC) + d.text((120, 872), "\u201cFluorescent beat effect\u201d, Wikimedia Commons, CC BY-SA 3.0", font=F(18, "r"), fill=MUTED) + source_tag(d, "results/video/engine_runs/public_fluorescent/.../overlay.mp4", 935) + + +def v_track(img, d, t, D, c): + s1 = c.sent_t[1] if len(c.sent_t) > 1 else D / 2 + heading(img, d, "Rebuild the grid frequency track.", t, 100, 56) + a = ease(t / 2.0) + im = c.enf + box = (160, 220, 1760, 220 + int(1600 * im.height / im.width)) + if t < s1 + 0.4: + crop = im.crop((0, 0, max(1, int(im.width * a)), im.height)) + crop = crop.resize((max(1, int((box[2] - box[0]) * a)), box[3] - box[1]), Image.BILINEAR) + rrect(d, (box[0] - 12, box[1] - 12, box[2] + 12, box[3] + 12), fill=(255, 255, 255), outline=LINE) + img.paste(crop, (box[0], box[1])) + source_tag(d, "engine output: results/video/engine_runs/capture_verified/.../enf_track.png", 935) + else: + heading(img, d, "Slide it along the grid log. One clear peak.", t, 170, 40, delay=s1 + 0.4, color=ACC) + im2 = c.ncc + b2 = (260, 260, 1660, 260 + int(1400 * im2.height / im2.width)) + b2 = (b2[0], b2[1], b2[2], min(b2[3], 880)) + rrect(d, (b2[0] - 12, b2[1] - 12, b2[2] + 12, b2[3] + 12), fill=(255, 255, 255), outline=LINE) + img.paste(im2.resize((b2[2] - b2[0], b2[3] - b2[1]), Image.BILINEAR), (b2[0], b2[1])) + source_tag(d, "engine output: results/video/engine_runs/capture_verified/.../ncc_scan.png", 935) + + +# --- live app walk-through: real screenshots, animated viewport + cursor +BX0, BY0, BX1, BY1 = 190, 160, 1730, 905 # browser content area on screen + + +def browser(img, d, shot: Image.Image, url_path: str, cam, cursor, clicks, t): + """cam = (cx, cy, cw) in screenshot pixels; cursor = (x, y) in screenshot pixels.""" + rrect(d, (BX0 - 10, BY0 - 62, BX1 + 10, BY1 + 10), fill=(36, 40, 46), outline=(60, 66, 74), r=14) + for k, col in enumerate([(240, 90, 80), (240, 190, 70), (90, 200, 100)]): + d.ellipse((BX0 + 10 + k * 26, BY0 - 40, BX0 + 26 + k * 26, BY0 - 24), fill=col) + rrect(d, (BX0 + 110, BY0 - 48, BX1 - 20, BY0 - 14), fill=(22, 24, 28), outline=(60, 66, 74), r=10, width=1) + d.text((BX0 + 130, BY0 - 31), "\U0001F512 https://" + APP_URL + "/" + url_path, font=F(19, "r"), fill=(200, 205, 210), anchor="lm") + cx, cy, cw = cam + ch = cw * (BY1 - BY0) / (BX1 - BX0) + x0, y0 = max(0, cx - cw / 2), max(0, cy - ch / 2) + x0, y0 = min(x0, shot.width - cw), min(y0, shot.height - ch) + crop = shot.crop((int(x0), int(y0), int(x0 + cw), int(y0 + ch))).resize((BX1 - BX0, BY1 - BY0), Image.BILINEAR) + img.paste(crop, (BX0, BY0)) + sc = (BX1 - BX0) / cw + + def to_screen(p): + return BX0 + (p[0] - x0) * sc, BY0 + (p[1] - y0) * sc + for (tc, p) in clicks: + if 0 <= t - tc < 0.6: + sx, sy = to_screen(p) + r = 10 + (t - tc) * 90 + a = int(255 * (1 - (t - tc) / 0.6)) + lay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + ImageDraw.Draw(lay).ellipse((sx - r, sy - r, sx + r, sy + r), outline=ACC + (a,), width=4) + img.alpha_composite(lay) + if cursor is not None: + sx, sy = to_screen(cursor) + pts = [(sx, sy), (sx, sy + 34), (sx + 9, sy + 26), (sx + 16, sy + 40), (sx + 22, sy + 37), (sx + 15, sy + 23), (sx + 26, sy + 23)] + d.polygon(pts, fill=(255, 255, 255), outline=(0, 0, 0)) + + +def track(keys, t): + """keys: list of (time, value-tuple); eased interpolation.""" + if t <= keys[0][0]: + return keys[0][1] + for (ta, va), (tb, vb) in zip(keys, keys[1:]): + if t <= tb: + u = ease((t - ta) / max(1e-6, tb - ta)) + return tuple(lerp(a, b, u) for a, b in zip(va, vb)) + return keys[-1][1] + + +def v_home(img, d, t, D, c): + s1 = c.sent_t[1] + cam = track([(0, (960, 560, 1500)), (s1, (960, 560, 1500)), (s1 + 1.2, (760, 700, 1000)), (D, (760, 760, 1000))], t) + cur = track([(0, (1300, 300)), (s1 + 0.8, (480, 414)), (s1 + 2.2, (675, 603)), (s1 + 3.4, (600, 690)), (D - 0.6, (501, 930))], t) + browser(img, d, c.shots["home"], "", cam, cur, [(s1 + 0.8, (480, 414)), (s1 + 2.2, (675, 603)), (D - 0.6, (501, 930))], t) + + +def v_cases(img, d, t, D, c): + cam = track([(0, (960, 700, 1300)), (1.6, (960, 1450, 1300)), (D, (960, 1520, 1300))], t) + s1 = c.sent_t[1] + cur = track([(0, (1200, 1100)), (s1, (468, 1350)), (D, (470, 1352))], t) + browser(img, d, c.shots["home"], "", cam, cur, [(s1 + 0.1, (468, 1350))], t) + + +def v_job(img, d, t, D, c): + s1, s2 = c.sent_t[1], c.sent_t[2] + cam = track([(0, (960, 560, 1500)), (1.0, (960, 560, 1500)), (2.2, (1240, 330, 760)), (s1, (1240, 330, 760)), + (s1 + 1.0, (1240, 470, 720)), (s2, (1240, 470, 720)), (s2 + 1.0, (1240, 600, 720)), (D, (1240, 610, 720))], t) + cur = track([(0, (1500, 900)), (2.0, (1130, 280)), (s1 + 0.8, (1100, 440)), (s2 + 0.8, (1080, 590)), (D, (1080, 630))], t) + browser(img, d, c.shots["job"], "#/jobs/aws3-capture-verified-040158", cam, cur, [], t) + + +def v_trace(img, d, t, D, c): + heading(img, d, "Agent trace", t, 100, 60) + d.text((110, 185), "Each step: one tool call through the MCP server, logged with its result.", font=F(28, "r"), fill=MUTED) + steps = c.trace["steps"] + y = 250 + for i, s in enumerate([s for s in steps if s.get("tool") != "render_report"][:9]): + a = ease((t - 0.4 - i * 0.35) / 0.4) + if a <= 0: + break + x = 110 + (1 - a) * 40 + lay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + ld = ImageDraw.Draw(lay) + ld.rounded_rectangle((x, y, x + 1700, y + 54), 10, fill=(20, 30, 38, int(240 * a)), outline=LINE + (int(255 * a),)) + ld.text((x + 20, y + 27), f"{i + 1:02d}", font=F(24, "m"), fill=ACC + (int(255 * a),), anchor="lm") + ld.text((x + 90, y + 27), str(s.get("tool")), font=F(26, "b"), fill=FG + (int(255 * a),), anchor="lm") + summ = str(s.get("output_summary") or "")[:88] + ld.text((x + 430, y + 27), summ, font=F(20, "m"), fill=MUTED + (int(255 * a),), anchor="lm") + img.alpha_composite(lay) + y += 62 + source_tag(d, "results/agent_traces/" + c.trace_name, 900) + + +def v_reviewer(img, d, t, D, c): + cam = track([(0, (960, 400, 1400)), (1.2, (900, 330, 1000)), (D, (880, 360, 960))], t) + cur = track([(0, (1300, 700)), (1.5, (700, 290)), (2.8, (700, 360)), (D - 0.8, (498, 510))], t) + browser(img, d, c.shots["reviewer"], "#/reviewer", cam, cur, [(1.5, (700, 290)), (D - 0.8, (498, 510))], t) + + +def v_limits(img, d, t, D, c): + cam = track([(0, (960, 500, 1300)), (D * 0.35, (960, 500, 1300)), (D, (960, 900, 1300))], t) + cur = track([(0, (1400, 300)), (D, (1300, 900))], t) + browser(img, d, c.shots["limits"], "#/limitations", cam, cur, [], t) + + +# --- architecture +NODES = { # id: (x, y, w, h, title, subtitle, appear_sentence) + "cap": (70, 170, 260, 96, "Capture app / Upload", "Android + web", 0), + "apigw": (400, 170, 250, 96, "API Gateway", "HTTPS entry", 0), + "alb": (720, 170, 220, 96, "ALB", "load balancer", 0), + "api": (1010, 170, 300, 96, "Fargate API", "arm64", 1), + "s3": (1400, 120, 280, 80, "S3 + KMS", "videos, reports", 1), + "sqs": (1400, 240, 280, 80, "SQS", "job queue", 1), + "eng": (70, 380, 860, 300, "ECS workers \u00b7 Graviton4 c8g", "OpenCV 5 engine \u00b7 15 stages", 2), + "agent": (1010, 380, 330, 120, "Agent + MCP server", "12 tools \u00b7 policies", 3), + "bed": (1400, 380, 330, 120, "Amazon Bedrock", "Amazon Nova Lite planner", 3), + "ddb": (1010, 580, 330, 100, "DynamoDB", "jobs \u00b7 grid log", 4), + "iot": (1400, 580, 330, 100, "IoT Core", "grid node ingest", 4), + "cog": (1010, 740, 330, 90, "Cognito", "reviewer sign-in", 4), + "cw": (1400, 740, 330, 90, "CloudWatch", "logs \u00b7 metrics", 4), +} +EDGES = [("cap", "apigw"), ("apigw", "alb"), ("alb", "api"), ("api", "s3"), ("api", "sqs"), ("sqs", "eng"), + ("eng", "agent"), ("agent", "bed"), ("eng", "ddb"), ("iot", "ddb"), ("cog", "api"), ("eng", "s3")] +CHIPS = ["LUT linearisation", "goodFeaturesToTrack", "calcOpticalFlowPyrLK", "findHomography USAC_MAGSAC", + "DISOpticalFlow", "dnn person masks", "FaceDetectorYN", "cv2.solve phase fit", "cv2.dft"] + + +def anchor(n, other): + x, y, w_, h_ = NODES[n][:4] + ox, oy, ow, oh = NODES[other][:4] + cx, cy, ocx, ocy = x + w_ / 2, y + h_ / 2, ox + ow / 2, oy + oh / 2 + dx, dy = ocx - cx, ocy - cy + if abs(dx) * h_ > abs(dy) * w_: + return (x + w_ if dx > 0 else x, cy) + return (cx, y + h_ if dy > 0 else y) + + +def v_arch(img, d, t, D, c): + st = c.sent_t + vis = {n for n, v in NODES.items() if t >= st[min(v[6], len(st) - 1)]} + for a, b in EDGES: + if a in vis and b in vis: + p, q = anchor(a, b), anchor(b, a) + d.line((p, q), fill=(60, 110, 100), width=3) + for k in range(2): + u = (t * 0.6 + k * 0.5 + hash(a + b) % 7 * 0.1) % 1.0 + px, py = lerp(p[0], q[0], u), lerp(p[1], q[1], u) + d.ellipse((px - 7, py - 7, px + 7, py + 7), fill=ACC) + for n, (x, y, w_, h_, ti, sub, s) in NODES.items(): + if n not in vis: + continue + a = ease((t - st[min(s, len(st) - 1)]) / 0.5) + lay = Image.new("RGBA", img.size, (0, 0, 0, 0)) + ld = ImageDraw.Draw(lay) + yy = y + (1 - a) * 20 + ld.rounded_rectangle((x, yy, x + w_, yy + h_), 14, fill=(18, 34, 40, int(245 * a)), outline=ACC + (int(255 * a),), width=2) + ld.text((x + 18, yy + 16), ti, font=F(26, "b"), fill=FG + (int(255 * a),)) + ld.text((x + 18, yy + 52), sub, font=F(20, "r"), fill=MUTED + (int(255 * a),)) + if n == "eng": + for i, ch in enumerate(CHIPS): + ca = ease((t - st[2] - 0.4 - i * 0.25) / 0.3) * a + cx_, cy_ = x + 18 + (i % 3) * 280, yy + 100 + (i // 3) * 62 + ld.rounded_rectangle((cx_, cy_, cx_ + 268, cy_ + 48), 8, fill=(30, 60, 52, int(255 * ca))) + ld.text((cx_ + 134, cy_ + 24), ch, font=F(19, "m"), fill=(200, 255, 225, int(255 * ca)), anchor="mm") + img.alpha_composite(lay) + + +def v_bench(img, d, t, D, c): + A, B = c.cost["configs"]["A"], c.cost["configs"]["B"] + heading(img, d, "Graviton vs x86 \u00b7 same OpenCV 5 engine", t, 110, 56) + rows = [("Throughput (video-s per wall-s) \u00b7 higher is better", + [(f"Graviton4 {B['instance_type']}", c.thr["B"], ACC), (f"x86 {A['instance_type']}", c.thr["A"], MUTED)], 2), + ("Cost per video-hour (USD) \u00b7 lower is better", + [(f"Graviton4 {B['instance_type']}", B["cost_per_video_hour_usd"], ACC), + (f"x86 {A['instance_type']}", A["cost_per_video_hour_usd"], MUTED)], 3)] + y = 250 + for ri, (title, bars, nd) in enumerate(rows): + a0 = 0.3 + ri * 1.6 + d.text((110, y), title, font=F(30, "b"), fill=FG) + y += 60 + mx = max(v for _, v, _ in bars) + for (lab, v, col) in bars: + a = ease((t - a0) / 1.2) + d.text((110, y + 30), lab, font=F(26, "r"), fill=FG, anchor="lm") + wbar = 1050 * (v / mx) * a + d.rounded_rectangle((520, y, 520 + max(4, wbar), y + 60), 10, fill=col) + prefix = "$" if nd == 3 else "" + d.text((540 + wbar, y + 30), f"{prefix}{v * a:.{nd}f}", font=F(32, "b"), fill=FG, anchor="lm") + y += 80 + y += 50 + source_tag(d, "results/bench/2026-10-27/cost.json \u00b7 A/summary.json \u00b7 B/summary.json", 890) + + +def v_close(img, d, t, D, c): + heading(img, d, "Three verdicts.", t, 110, 72) + for i, v in enumerate(["VERIFIED", "CONTRADICTED", "INCONCLUSIVE"]): + a = ease((t - 0.5 - i * 0.5) / 0.5) + if a <= 0: + continue + x, y = 110 + i * 580, 260 + (1 - a) * 40 + col = VCOL[v] + rrect(d, (x, y, x + 540, y + 150), fill=tuple(int(cc * 0.25) for cc in col), outline=col, r=18, width=3) + ic = {"VERIFIED": "\u2714", "CONTRADICTED": "\u2716", "INCONCLUSIVE": "?"}[v] + d.text((x + 40, y + 75), ic, font=F(60, "s"), fill=col, anchor="lm") + d.text((x + 120, y + 75), v, font=F(44, "b"), fill=FG, anchor="lm") + sub = {0: "", 1: "after human review", 2: "missing signal \u2260 evidence against a video"} + for i in (1, 2): + if t > 1.5: + d.text((110 + i * 580, 430), sub[i], font=F(22, "r"), fill=MUTED) + s2 = c.sent_t[2] if len(c.sent_t) > 2 else 3 + if t > s2: + heading(img, d, "Limits: needs mains lighting \u00b7 many phone videos give INCONCLUSIVE \u00b7 real-world evaluation pending.", + t, 520, 28, delay=s2, color=MUTED) + s3 = c.sent_t[3] if len(c.sent_t) > 3 else 6 + if t > s3: + heading(img, d, "GRIDPRINT", t, 610, 96, delay=s3, color=ACC) + heading(img, d, REPO, t, 740, 44, delay=s3 + 0.4) + heading(img, d, "OpenCV 5 \u00b7 AWS \u00b7 live at " + APP_URL, t, 810, 26, delay=s3 + 0.6, color=MUTED) + + +VIS = {"hook": v_hook, "dismiss": v_dismiss, "bulb": v_bulb, "pain": v_pain, "flicker": v_flicker, "rolling": v_rolling, + "overlay": v_overlay, "track": v_track, "home": v_home, "cases": v_cases, "job": v_job, "trace": v_trace, + "reviewer": v_reviewer, "limits": v_limits, "arch": v_arch, "bench": v_bench, "close": v_close} + + +# ----------------------------------------------------------------------------- build +def srt_time(s: float) -> str: + ms = int(round(s * 1000)) + return f"{ms // 3600000:02d}:{ms // 60000 % 60:02d}:{ms // 1000 % 60:02d},{ms % 1000:03d}" + + +def main() -> int: + BUILD.mkdir(parents=True, exist_ok=True) + c = Ctx() + clip = load_frames(PUBLIC_CLIP) + c.clip = clip + c.clip_blur = [np.clip(cv2.GaussianBlur(cv2.resize(f, (W, H)), (0, 0), 18) * 0.35, 0, 255).astype(np.uint8) + for f in clip[::2]] + c.clip_blur = [x for x in c.clip_blur for _ in (0, 1)] + c.ovl = load_frames(RUNS / "public_fluorescent" / "public_fluorescent" / "overlay.mp4") + c.enf = Image.open(RUNS / "capture_verified" / "capture_verified" / "enf_track.png").convert("RGB") + c.ncc = Image.open(RUNS / "capture_verified" / "capture_verified" / "ncc_scan.png").convert("RGB") + c.shots = {k: Image.open(LIVE / f"{k}.png").convert("RGB") for k in ("home", "job", "reviewer", "limits")} + tp = ROOT / "results" / "agent_traces" / "clean__s1001.json" + c.trace, c.trace_name = json.loads(tp.read_text()), tp.name + c.cost = json.loads((BENCH / "cost.json").read_text()) + c.thr = {k: json.loads((BENCH / k / "summary.json").read_text())["throughput_video_s_per_wall_s"]["mean"] for k in "AB"} + + beats, allsent = [], [] + for num, title, bl in SECTIONS: + for key, sents in bl: + beats.append((num, title, key, sents)) + allsent += sents + audio = tts_all(allsent) + # timeline + timeline, srt, t0, ai = [], [], 0.0, 0 + track_audio = [] + for num, title, key, sents in beats: + st, tcur = [], LEAD + for s in sents: + a = audio[ai] + ai += 1 + st.append(tcur) + srt.append((t0 + tcur, t0 + tcur + len(a) / SR, s)) + track_audio.append((t0 + tcur, a)) + tcur += len(a) / SR + GAP + D = tcur - GAP + TAIL + timeline.append((t0, D, num, title, key, st, sents)) + t0 += D + total = t0 + 1.0 + print(f"total duration {total:.1f}s") + if total > 238: + print("WARNING: over 3:58") + mix = np.zeros(int(total * SR) + SR, np.float32) + for ts, a in track_audio: + i = int(ts * SR) + mix[i:i + len(a)] += a * 0.95 + wav_p = BUILD / "narration.wav" + with wave.open(str(wav_p), "wb") as w: + w.setnchannels(1) + w.setsampwidth(2) + w.setframerate(SR) + w.writeframes((np.clip(mix, -1, 1) * 32767).astype(np.int16).tobytes()) + + if "--stills" in sys.argv: + for t0s, D, num, title, key, st, sents in timeline: + for frac in (0.3, 0.85): + c.sent_t = st + img = background().convert("RGBA") + d = ImageDraw.Draw(img) + VIS[key](img, d, D * frac, D, c) + tagline(ImageDraw.Draw(img), num, title) + caption(img, sents[min(len(sents) - 1, int(frac * len(sents)))]) + img.convert("RGB").resize((960, 540)).save(BUILD / f"still_{num}_{key}_{int(frac * 100)}.png") + return 0 + out_mp4 = OUT / "gridprint_submission.mp4" + cmd = ["ffmpeg", "-v", "error", "-y", "-f", "rawvideo", "-pix_fmt", "rgb24", "-s", f"{W}x{H}", "-r", str(FPS), "-i", "-", + "-i", str(wav_p), "-c:v", "libx264", "-preset", "veryfast", "-crf", "20", "-pix_fmt", "yuv420p", + "-c:a", "aac", "-b:a", "160k", "-shortest", "-movflags", "+faststart", str(out_mp4)] + proc = subprocess.Popen(cmd, stdin=subprocess.PIPE) + nfr = int(total * FPS) + seg = 0 + for fi in range(nfr): + tg = fi / FPS + while seg < len(timeline) - 1 and tg >= timeline[seg][0] + timeline[seg][1]: + seg += 1 + t0s, D, num, title, key, st, sents = timeline[seg] + t = tg - t0s + c.sent_t = st + img = background().convert("RGBA") + d = ImageDraw.Draw(img) + VIS[key](img, d, t, D, c) + d = ImageDraw.Draw(img) + tagline(d, num, title) + for (a, b, s) in srt: + if a - 0.05 <= tg < b + 0.25: + caption(img, s) + break + arr = np.asarray(img.convert("RGB")) + fade = min(1.0, t / 0.3, (D - t) / 0.3) if key != "hook" or t > 0.3 else t / 0.3 + if tg > total - 1.0: + fade = 0.0 + if fade < 1: + arr = (arr.astype(np.float32) * max(0.0, fade)).astype(np.uint8) + proc.stdin.write(arr.tobytes()) + if fi % 300 == 0: + print(f"frame {fi}/{nfr} ({key})", flush=True) + proc.stdin.close() + proc.wait() + + (OUT / "gridprint_submission.srt").write_text( + "".join(f"{i + 1}\n{srt_time(a)} --> {srt_time(b)}\n{s}\n\n" for i, (a, b, s) in enumerate(srt)), encoding="utf-8") + md = ["# GRIDPRINT submission video: script", "", + f"Generated by `video/make_pitch.py`. Voice: edge-tts `{VOICE}` (rate {RATE}). Duration: {total:.1f} s.", + "Style: ASD-STE100 Simplified Technical English (short sentences, active voice, one idea per sentence).", "", + "Sources on screen: live AWS app screenshots (`video/assets/live/`, captured with headless Chrome), " + "`data/public/fluorescent_beat_effect.mp4` (Wikimedia Commons, CC BY-SA 3.0), engine outputs in " + "`results/video/engine_runs/`, agent trace `results/agent_traces/clean__s1001.json`, benchmark " + "`results/bench/2026-10-27/`.", ""] + for t0s, D, num, title, key, st, sents in timeline: + md += [f"## {num} {title} / {key} ({srt_time(t0s)[:-4]} - {srt_time(t0s + D)[:-4]})", ""] + [f"- {s}" for s in sents] + [""] + (ROOT / "docs" / "VIDEO_SCRIPT.md").write_text("\n".join(md), encoding="utf-8") + print("done", out_mp4) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/video/make_video.py b/video/make_video.py new file mode 100644 index 0000000..8648695 --- /dev/null +++ b/video/make_video.py @@ -0,0 +1,1113 @@ +"""Reproducible generator for the GRIDPRINT submission video (SPEC 14.4, docs/VIDEO_SCRIPT.md, human task H8). + +Run from the repository root: + + PYTHONPATH=".;engine" python video/make_video.py # build (runs missing engine jobs first) + PYTHONPATH=".;engine" python video/make_video.py --rerun-engine # re-run all engine jobs + +Inputs: video/scenes.yaml, video/assets/* (optional screenshots / team clip), files under results/, docs/diagrams/. +Outputs: results/video/gridprint_submission.mp4, results/video/manifest.json, results/video/build/ (cache). + +Rules kept here: +- Every number on screen is read from a file under results/ and shown with its source path. No typed numbers. +- Verdicts on screen are the engine's own output (result JSON written by the engine run), shown verbatim. +- Clips from the simulator carry the on-screen label "SYNTHETIC test clip". +- Missing inputs render a neutral placeholder card and a warning; nothing is invented. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import math +import re +import subprocess +import sys +import wave +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any + +import cv2 +import numpy as np +import yaml +from PIL import Image, ImageDraw, ImageFont + +ROOT = Path(__file__).resolve().parents[1] +VIDEO_DIR = ROOT / "video" +OUT_DIR = ROOT / "results" / "video" +BUILD = OUT_DIR / "build" +RUNS = OUT_DIR / "engine_runs" +OUT_MP4 = OUT_DIR / "gridprint_submission.mp4" +PY = sys.executable + +W, H, FPS = 1920, 1080, 30 +LIMIT_S = 300.0 +TARGET_MAX_S = 290.0 # keep a margin below the 300 s limit +LEAD_S, TAIL_S = 0.5, 0.8 +SUB_TOP = 948 # subtitle band starts here; content stays above it + +# colors (RGB) +BG = (16, 20, 28) +PANEL = (28, 34, 46) +FG = (236, 239, 244) +MUTED = (150, 160, 178) +ACCENT = (255, 196, 64) +VERDICT_STYLE = { # text + icon, never color alone + "VERIFIED": ((46, 160, 90), "\u2714"), + "CONTRADICTED": ((200, 50, 50), "\u2716"), + "INCONCLUSIVE": ((120, 128, 140), "?"), +} + +FONT_DIR = Path("C:/Windows/Fonts") +WARNINGS: list[str] = [] + + +def warn(msg: str) -> None: + WARNINGS.append(msg) + print(f"WARNING: {msg}", flush=True) + + +def font(size: int, kind: str = "reg") -> ImageFont.FreeTypeFont: + name = {"reg": "segoeui.ttf", "bold": "segoeuib.ttf", "mono": "consola.ttf", "sym": "seguisym.ttf", + "light": "segoeuil.ttf"}[kind] + p = FONT_DIR / name + if p.exists(): + return ImageFont.truetype(str(p), size) + return ImageFont.load_default(size) + + +def rel(p: Path | str) -> str: + p = Path(p) + try: + return p.resolve().relative_to(ROOT).as_posix() + except ValueError: + return p.as_posix() + + +# ----------------------------------------------------------------------------------------------- narration checks +FORBIDDEN_WORD_RE = re.compile(r"\bprov(e|es|ed|ing)\b", re.IGNORECASE) + + +def lint_narration(scene_id: str, text: str) -> None: + sys.path.insert(0, str(ROOT)) + from scripts.claims_lint import scan_text # noqa: PLC0415 - repo script, R5 forbidden claims + + hits = scan_text(text) + if hits: + raise SystemExit(f"narration of scene '{scene_id}' has forbidden claims: {hits}") + if FORBIDDEN_WORD_RE.search(text): + raise SystemExit(f"narration of scene '{scene_id}' uses 'prove'; say 'checks' instead") + + +# ----------------------------------------------------------------------------------------------- TTS +PS1 = r"""param([string]$InFile, [string]$OutFile) +Add-Type -AssemblyName System.Speech +$s = New-Object System.Speech.Synthesis.SpeechSynthesizer +$s.Rate = 0 +$text = Get-Content -Raw -Encoding UTF8 -Path $InFile +$s.SetOutputToWaveFile($OutFile) +$s.Speak($text) +$s.Dispose() +""" + + +def tts(text: str) -> Path: + """Synthesize text with Windows System.Speech. Cached by text hash.""" + d = BUILD / "tts" + d.mkdir(parents=True, exist_ok=True) + h = hashlib.sha256(("v1|" + text).encode()).hexdigest()[:16] + out = d / f"{h}.wav" + if out.exists() and out.stat().st_size > 1000: + return out + ps1 = d / "speak.ps1" + ps1.write_text(PS1, encoding="utf-8") + txt = d / f"{h}.txt" + txt.write_text(text, encoding="utf-8") + subprocess.run(["powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-File", str(ps1), + "-InFile", str(txt), "-OutFile", str(out)], check=True) + return out + + +def read_wav(p: Path) -> tuple[np.ndarray, int]: + with wave.open(str(p), "rb") as w: + sr, ch, sw = w.getframerate(), w.getnchannels(), w.getsampwidth() + raw = w.readframes(w.getnframes()) + if sw != 2: + raise SystemExit(f"unexpected sample width in {p}") + a = np.frombuffer(raw, dtype=np.int16).astype(np.float32) / 32768.0 + if ch > 1: + a = a.reshape(-1, ch).mean(axis=1) + return a, sr + + +def resample(a: np.ndarray, sr: int, to: int) -> np.ndarray: + if sr == to or len(a) == 0: + return a + n = int(round(len(a) * to / sr)) + return np.interp(np.linspace(0, len(a) - 1, n), np.arange(len(a)), a).astype(np.float32) + + +# ----------------------------------------------------------------------------------------------- data access +def load_json(p: Path) -> Any | None: + try: + return json.loads(Path(p).read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + return None + + +@dataclass +class Run: + name: str + cfg: dict[str, Any] + meta: dict[str, Any] | None = None + result: dict[str, Any] | None = None + result_path: Path | None = None + files: dict[str, Path] = field(default_factory=dict) + synthetic: bool = False + + @property + def verdict(self) -> str | None: + return (self.result or {}).get("verdict") + + +def ensure_runs(cfg: dict[str, Any], rerun: bool, no_engine: bool = False) -> dict[str, Run]: + runs: dict[str, Run] = {} + for name, rc in cfg.items(): + wd = RUNS / name + meta_p = wd / "run_meta.json" + if not no_engine and (rerun or not meta_p.exists()): + print(f"[engine] running {name} on {rc['video']} (this can take several minutes)", flush=True) + cmd = [PY, str(VIDEO_DIR / "run_engine.py"), name, rc["video"], "--gridlog", rc.get("gridlog", "")] + if rc.get("sidecar"): + cmd += ["--sidecar", rc["sidecar"]] + env = dict(**__import__("os").environ) + env["PYTHONPATH"] = f"{ROOT};{ROOT / 'engine'}" + subprocess.run(cmd, cwd=ROOT, env=env, check=False) + r = Run(name, rc, meta=load_json(meta_p)) + # the engine's own result JSON (S15 write_json) wherever it put it; fall back to our dump of job.result + cands = [p for p in wd.rglob("result.json")] + [wd / "video_result.json"] + for p in cands: + j = load_json(p) + if j and "verdict" in j: + r.result, r.result_path = j, p + break + for pat in ["overlay.mp4", "enf_track.png", "phase_residual.png", "ncc_scan.png", "band_amplitude.png", + "plots.json", "report.html"]: + hits = sorted(wd.rglob(pat)) + if hits: + r.files[pat] = hits[0] + truth = load_json(Path(rc["truth"])) if rc.get("truth") else None + r.synthetic = bool(truth and truth.get("label") == "SYNTHETIC") + if r.result is None: + err = (r.meta or {}).get("error", "no result file") + warn(f"engine run '{name}' has no result ({err}); scene shows a pending card") + runs[name] = r + return runs + + +def find_agent_trace() -> tuple[dict[str, Any] | None, Path | None]: + """Prefer results/agent_traces/*.json; else an agent trace written by the eval harness (planner field set).""" + cands = sorted((ROOT / "results" / "agent_traces").glob("*.json")) if (ROOT / "results" / "agent_traces").exists() else [] + best: tuple[int, dict[str, Any] | None, Path | None] = (-1, None, None) + pool = cands or sorted((ROOT / "results" / "eval").glob("**/trace.json")) + for p in pool: + t = load_json(p) + if not t or not isinstance(t.get("steps"), list) or not t["steps"]: + continue + if not any(s.get("planner") for s in t["steps"]): + continue # not an agent trace (plain run_default trace) + score = 1 + (10 if trace_kind(t) == "recovery" else 0) + (5 if p in cands else 0) + if score > best[0]: + best = (score, t, p) + if best[1] is None: + warn("no agent trace found under results/; trace scene shows 'Agent trace: see results'") + return best[1], best[2] + + +def _snr(step: dict[str, Any]) -> float | None: + try: + return float(json.loads(step.get("output_summary") or "{}").get("band_snr_db")) + except (TypeError, ValueError, json.JSONDecodeError): + return None + + +def trace_kind(t: dict[str, Any] | None) -> str: + if not t: + return "none" + ex = [s for s in t["steps"] if s.get("tool") == "extract_flicker" and _snr(s) is not None] + if len(ex) >= 2 and _snr(ex[-1]) > _snr(ex[0]): # type: ignore[operator] + # recovery only if the later extraction was followed by matching (signal usable) + tools = [s.get("tool") for s in t["steps"]] + if "match_reference" in tools: + return "recovery" + return "plain" + + +def collect_results() -> dict[str, list[tuple[Path, Any]]]: + out: dict[str, list[tuple[Path, Any]]] = {"eval": [], "bench_summary": [], "bench_cost": [], "bench_parity": []} + for p in sorted((ROOT / "results" / "eval").glob("**/summary.json")): + if "work" in p.parts: + continue + out["eval"].append((p, load_json(p))) + for key, nm in [("bench_summary", "summary.json"), ("bench_cost", "cost.json"), ("bench_parity", "parity.json")]: + for p in sorted((ROOT / "results" / "bench").glob(f"**/{nm}")): + if "work" in p.parts: + continue + out[key].append((p, load_json(p))) + if not out["eval"]: + warn("results/eval/**/summary.json not found: evaluation results shown as 'Results pending'") + if not out["bench_cost"]: + warn("results/bench/**/cost.json not found: cost shown as 'Results pending'") + if not out["bench_parity"]: + warn("results/bench/**/parity.json not found: parity shown as 'Results pending'") + return out + + +def svg_to_png(svg: Path, override: Path) -> Path | None: + """Rasterize a diagram SVG. Order: supplied PNG override, cairosvg, headless Edge/Chrome screenshot.""" + if override.exists(): + return override + out = BUILD / (svg.stem + ".png") + if out.exists() and out.stat().st_mtime >= svg.stat().st_mtime: + return out + BUILD.mkdir(parents=True, exist_ok=True) + m = re.search(r'viewBox="([\d.\s-]+)"', svg.read_text(encoding="utf-8", errors="ignore")[:4000]) + vw, vh = (float(v) for v in m.group(1).split()[2:4]) if m else (1600.0, 1000.0) + try: + import cairosvg # type: ignore[import-not-found] # noqa: PLC0415 + + cairosvg.svg2png(url=str(svg), write_to=str(out), output_width=int(min(3200, vw))) + return out + except Exception: # noqa: BLE001 - optional dependency; fall through to the browser + pass + width = 2600 + height = int(math.ceil(width * vh / vw)) + html = BUILD / (svg.stem + "_wrap.html") + html.write_text(f"" + f"" + f"", encoding="utf-8") + for exe in [Path("C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"), + Path("C:/Program Files/Google/Chrome/Application/chrome.exe")]: + if not exe.exists(): + continue + subprocess.run([str(exe), "--headless=new", "--disable-gpu", "--hide-scrollbars", "--allow-file-access-from-files", + "--force-device-scale-factor=1", f"--window-size={width},{height}", + f"--screenshot={out}", html.resolve().as_uri()], + capture_output=True, timeout=120, check=False) + if out.exists() and out.stat().st_size > 10000: + return out + needs = VIDEO_DIR / "NEEDS.md" + needs.write_text(f"# Needed for the video\n\n- PNG export of `{rel(svg)}` at `{rel(override)}` " + "(SVG conversion failed: no cairosvg and no headless browser).\n", encoding="utf-8") + warn(f"could not convert {rel(svg)}; see video/NEEDS.md") + return None + + +# ----------------------------------------------------------------------------------------------- drawing helpers +def canvas() -> Image.Image: + return Image.new("RGB", (W, H), BG) + + +def wrap_px(draw: ImageDraw.ImageDraw, text: str, f: ImageFont.FreeTypeFont, max_w: int) -> list[str]: + words, lines, cur = text.split(), [], "" + for w_ in words: + t = (cur + " " + w_).strip() + if draw.textlength(t, font=f) <= max_w or not cur: + cur = t + else: + lines.append(cur) + cur = w_ + if cur: + lines.append(cur) + return lines + + +def heading(img: Image.Image, text: str, sub: str | None = None) -> None: + d = ImageDraw.Draw(img) + d.rectangle([0, 0, W, 6], fill=ACCENT) + d.text((60, 34), text, font=font(50, "bold"), fill=FG) + if sub: + d.text((62, 98), sub, font=font(26), fill=MUTED) + d.text((W - 60, 44), "GRIDPRINT", font=font(30, "bold"), fill=MUTED, anchor="ra") + + +def tag(img: Image.Image, xy: tuple[int, int], text: str, fill: tuple[int, int, int] = ACCENT, + fg: tuple[int, int, int] = (20, 20, 20), size: int = 26) -> int: + d = ImageDraw.Draw(img) + f = font(size, "bold") + tw = int(d.textlength(text, font=f)) + x, y = xy + d.rounded_rectangle([x, y, x + tw + 28, y + size + 18], radius=8, fill=fill) + d.text((x + 14, y + 6), text, font=f, fill=fg) + return x + tw + 28 + + +def source_line(img: Image.Image, text: str, y: int = SUB_TOP - 40) -> None: + ImageDraw.Draw(img).text((60, y), text, font=font(22, "mono"), fill=MUTED) + + +def paste_fit(img: Image.Image, src: Image.Image, box: tuple[int, int, int, int], bg: tuple[int, int, int] | None = None) -> tuple[int, int, int, int]: + x0, y0, x1, y1 = box + bw, bh = x1 - x0, y1 - y0 + s = min(bw / src.width, bh / src.height) + nw, nh = max(1, int(src.width * s)), max(1, int(src.height * s)) + r = src.resize((nw, nh), Image.LANCZOS) + if bg is not None: + ImageDraw.Draw(img).rectangle(box, fill=bg) + px, py = x0 + (bw - nw) // 2, y0 + (bh - nh) // 2 + img.paste(r, (px, py)) + return px, py, px + nw, py + nh + + +def placeholder(img: Image.Image, box: tuple[int, int, int, int], title: str, sub: str = "") -> None: + d = ImageDraw.Draw(img) + d.rounded_rectangle(box, radius=18, fill=PANEL, outline=(70, 80, 98), width=3) + cx, cy = (box[0] + box[2]) // 2, (box[1] + box[3]) // 2 + d.text((cx, cy - 20), title, font=font(48, "bold"), fill=MUTED, anchor="mm") + if sub: + for i, ln in enumerate(wrap_px(d, sub, font(26), box[2] - box[0] - 80)): + d.text((cx, cy + 36 + i * 34), ln, font=font(26), fill=MUTED, anchor="mm") + + +def fmt(v: Any, nd: int = 3) -> str: + if v is None: + return "n/a" + if isinstance(v, float): + return f"{v:.{nd}g}" if abs(v) < 1e-3 or abs(v) >= 1e5 else f"{v:.{nd}f}".rstrip("0").rstrip(".") + return str(v) + + +def verdict_card(img: Image.Image, box: tuple[int, int, int, int], run: Run, label: str) -> None: + d = ImageDraw.Draw(img) + x0, y0, x1, y1 = box + d.rounded_rectangle(box, radius=18, fill=PANEL) + res = run.result + if res is None: + placeholder(img, box, "Engine run pending", f"No result file under {rel(RUNS / run.name)} yet.") + return + v = res["verdict"] + col, icon = VERDICT_STYLE.get(v, ((120, 120, 120), "?")) + d.rounded_rectangle([x0, y0, x1, y0 + 120], radius=18, fill=col) + d.rectangle([x0, y0 + 100, x1, y0 + 120], fill=col) + d.text((x0 + 34, y0 + 60), icon, font=font(70, "sym"), fill=(255, 255, 255), anchor="lm") + d.text((x0 + 120, y0 + 60), v, font=font(58, "bold"), fill=(255, 255, 255), anchor="lm") + y = y0 + 140 + rows = [("State", res.get("lifecycle_state"))] + if v == "CONTRADICTED": + rows.append(("Review", "a person must approve before FINAL")) + if res.get("time_estimate_iso"): + rows.append(("Time (UTC)", str(res["time_estimate_iso"]).replace("T", " ").replace("+00:00", ""))) + if res.get("time_uncertainty_s") is not None: + rows.append(("Uncertainty", f"± {fmt(res['time_uncertainty_s'])} s")) + if res.get("zone"): + rows.append(("Grid zone", res["zone"])) + q = res.get("quality") or {} + if q.get("band_snr_db") is not None: + rows.append(("Band SNR", f"{fmt(q['band_snr_db'])} dB")) + ev = [e for e in res.get("continuity_events") or [] if e.get("kind") == "EDIT_CANDIDATE"] + if ev: + rows.append(("Edit marks", ", ".join(f"t = {fmt(e['t_s'])} s" for e in ev[:3]))) + fk, fv = font(26), font(26, "bold") + for k, val in rows: + d.text((x0 + 30, y), k, font=fk, fill=MUTED) + for i, ln in enumerate(wrap_px(d, str(val), fv, x1 - x0 - 260)): + d.text((x0 + 230, y + i * 32), ln, font=fv, fill=FG) + y += 32 if i else 0 + y += 42 + reasons = res.get("reasons") or [] + if reasons: + d.text((x0 + 30, y), "Reasons", font=fk, fill=MUTED) + y += 38 + for r in reasons[:6]: + d.text((x0 + 46, y), str(r), font=font(24, "mono"), fill=FG) + y += 32 + tx = x0 + 30 + tag(img, (tx, y1 - 64), label, fill=ACCENT if "SYNTHETIC" in label else (90, 140, 220), + fg=(20, 20, 20) if "SYNTHETIC" in label else (255, 255, 255), size=24) + + +# ----------------------------------------------------------------------------------------------- video readers +class Clip: + def __init__(self, path: Path): + self.cap = cv2.VideoCapture(str(path)) + self.fps = self.cap.get(cv2.CAP_PROP_FPS) or 30.0 + self.n = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT) or 0) + self.pos = -1 + self.last: np.ndarray | None = None + + def frame_at(self, t: float) -> Image.Image | None: + if self.n <= 0: + return None + idx = int(t * self.fps) % self.n + if idx != self.pos + 1: + self.cap.set(cv2.CAP_PROP_POS_FRAMES, idx) + if idx != self.pos or self.last is None: + ok, f = self.cap.read() + if not ok: + self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0) + ok, f = self.cap.read() + if not ok: + return None if self.last is None else Image.fromarray(self.last) + self.last = cv2.cvtColor(f, cv2.COLOR_BGR2RGB) + self.pos = idx + return Image.fromarray(self.last) + + +# ----------------------------------------------------------------------------------------------- scene renderers +class Scene: + def __init__(self, spec: dict[str, Any], ctx: dict[str, Any]): + self.spec, self.ctx, self.v = spec, ctx, spec["visual"] + self.sources: list[str] = [] + self.pending: list[str] = [] + self._static: Image.Image | None = None + self.duration = 0.0 + self.audio_override: Path | None = None + self.prepare() + + def prepare(self) -> None: # noqa: B027 - optional hook + pass + + def static(self) -> Image.Image: + raise NotImplementedError + + def frame(self, t: float) -> Image.Image: + if self._static is None: + self._static = self.static() + return self._static.copy() + + +class TitleScene(Scene): + def static(self) -> Image.Image: + img = canvas() + d = ImageDraw.Draw(img) + d.rectangle([0, 0, W, 6], fill=ACCENT) + d.text((W // 2, 300), self.v["title"], font=font(150, "bold"), fill=FG, anchor="mm") + y = 470 + for ln in self.v.get("lines", []): + for sub in wrap_px(d, ln, font(54), 1500): + d.text((W // 2, y), sub, font=font(54), fill=FG, anchor="mm") + y += 74 + y += 10 + if self.v.get("footer"): + d.text((W // 2, SUB_TOP - 60), self.v["footer"], font=font(30), fill=MUTED, anchor="mm") + return img + + +class PublicClipScene(Scene): + def prepare(self) -> None: + self.path = Path(self.ctx["cfg"]["engine_runs"]["public_fluorescent"]["video"]) + self.clip = Clip(self.path) if self.path.exists() else None + self.sources.append(self.path.as_posix()) + if self.clip is None: + self.pending.append(f"public clip missing: {self.path}") + + def static(self) -> Image.Image: + img = canvas() + heading(img, self.v["heading"]) + d = ImageDraw.Draw(img) + y = 200 + for b in self.v.get("bullets", []): + lines = wrap_px(d, b, font(34), 640) + d.text((1220, y), "\u2022", font=font(34), fill=ACCENT) + for i, ln in enumerate(lines): + d.text((1250, y + i * 46), ln, font=font(34), fill=FG) + y += 46 * len(lines) + 28 + d.text((60, SUB_TOP - 46), self.ctx["cfg"]["credit_public"], font=font(26), fill=FG) + return img + + def frame(self, t: float) -> Image.Image: + img = super().frame(t) + box = (60, 150, 1180, 150 + 840) + if self.clip is None: + placeholder(img, box, "Public clip missing") + return img + f = self.clip.frame_at(t) + if f is not None: + paste_fit(img, f, (60, 150, 1180, SUB_TOP - 60)) + return img + + +class EngineRunScene(Scene): + def prepare(self) -> None: + self.run: Run = self.ctx["runs"][self.v["run"]] + self.ov = self.run.files.get("overlay.mp4") + self.clip = Clip(self.ov) if self.ov else None + if self.run.result_path: + self.sources.append(rel(self.run.result_path)) + if self.ov: + self.sources.append(rel(self.ov)) + else: + self.pending.append(f"overlay.mp4 for run {self.run.name}") + if self.run.result is None: + self.pending.append(f"engine result for run {self.run.name}") + self.t0 = 0.0 + if self.v.get("seek") == "continuity" and self.run.result: + ev = [e for e in self.run.result.get("continuity_events") or [] if e.get("kind") == "EDIT_CANDIDATE"] + if ev: + self.t0 = max(0.0, float(ev[0]["t_s"]) - 6.0) + self.side = self.run.files.get(self.v.get("side_plot", "")) if self.v.get("side_plot") else None + if self.side: + self.sources.append(rel(self.side)) + if self.run.name == "public_fluorescent": + self.label = "Public clip: Wikimedia Commons, CC BY-SA 3.0" + elif self.run.synthetic: + self.label = "SYNTHETIC test clip" + else: + self.label = "Clip source: " + Path(self.run.cfg["video"]).name + + def static(self) -> Image.Image: + img = canvas() + heading(img, self.v["heading"], f"Input: {Path(self.run.cfg['video']).name}" + + (" · sidecar" if self.run.cfg.get("sidecar") else " · no sidecar")) + verdict_card(img, (1240, 150, 1860, SUB_TOP - 60), self.run, self.label) + if self.run.result_path: + source_line(img, "source: " + rel(self.run.result_path), y=SUB_TOP - 46) + if self.side: + p = Image.open(self.side).convert("RGB") + paste_fit(img, p, (60, 716, 1200, SUB_TOP - 56), bg=(255, 255, 255)) + return img + + def frame(self, t: float) -> Image.Image: + img = super().frame(t) + vbox_bottom = 680 if self.side else SUB_TOP - 120 + box = (60, 150, 1200, vbox_bottom) + f = self.clip.frame_at(self.t0 + t) if self.clip else None + if f is None: + placeholder(img, box, "Overlay pending", "The engine has not produced overlay.mp4 for this run.") + return img + x0, y0, x1, y1 = paste_fit(img, f, box) + d = ImageDraw.Draw(img) + d.rectangle([x0, y1 - 40, x1, y1], fill=(0, 0, 0)) + d.text(((x0 + x1) // 2, y1 - 20), "Visualization of measured flicker. Not itself evidence.", + font=font(24), fill=(255, 255, 255), anchor="mm") + if self.run.synthetic: + tag(img, (x0 + 14, y0 + 14), "SYNTHETIC test clip", size=24) + if self.clip and self.clip.n: + vt = ((self.t0 + t) * self.clip.fps % self.clip.n) / self.clip.fps + d.text((x0, y1 + 8), f"overlay.mp4 t = {vt:5.1f} s", font=font(20, "mono"), fill=MUTED) + return img + + +class PlotsScene(Scene): + def prepare(self) -> None: + self.run: Run = self.ctx["runs"][self.v["run"]] + self.paths = [self.run.files.get(f) for f in self.v["files"]] + pj = load_json(self.run.files["plots.json"]) if "plots.json" in self.run.files else None + self.caps: dict[str, str] = {} + if isinstance(pj, list): + self.caps = {p.get("file"): p.get("caption", "") for p in pj if isinstance(p, dict)} + elif isinstance(pj, dict): + for p in pj.get("plots", []): + self.caps[p.get("file")] = p.get("caption", "") + for f, p in zip(self.v["files"], self.paths, strict=True): + if p: + self.sources.append(rel(p)) + else: + self.pending.append(f"{f} for run {self.run.name}") + + def static(self) -> Image.Image: + img = canvas() + heading(img, self.v["heading"], ("SYNTHETIC test clip · " if self.run.synthetic else "") + + Path(self.run.cfg["video"]).name) + n = len(self.paths) + top, bottom = 150, SUB_TOP - 60 + hh = (bottom - top) // n + d = ImageDraw.Draw(img) + for i, (f, p) in enumerate(zip(self.v["files"], self.paths, strict=True)): + box = (60, top + i * hh + 4, 1440, top + (i + 1) * hh - 8) + if p is None: + placeholder(img, box, f"{f}: pending") + continue + paste_fit(img, Image.open(p).convert("RGB"), box, bg=(255, 255, 255)) + cap = self.caps.get(f, "") + yy = box[1] + 10 + for ln in wrap_px(d, cap, font(28), 400): + d.text((1470, yy), ln, font=font(28), fill=FG) + yy += 38 + d.text((1470, yy + 10), rel(p), font=font(18, "mono"), fill=MUTED) + if self.run.synthetic: + tag(img, (1470, bottom - 50), "SYNTHETIC test clip", size=24) + return img + + +class UIScene(Scene): + def prepare(self) -> None: + self.shots = [] + for s in self.v["shots"]: + p = ROOT / s["file"] + if p.exists(): + self.shots.append((s["caption"], Image.open(p).convert("RGB"), p)) + self.sources.append(rel(p)) + else: + self.shots.append((s["caption"], None, p)) + self.pending.append(f"UI screenshot {s['file']}") + warn(f"UI screenshot missing: {s['file']} (neutral card shown)") + self._cache: dict[int, Image.Image] = {} + + def frame(self, t: float) -> Image.Image: + i = min(len(self.shots) - 1, int(t / max(self.duration, 1e-6) * len(self.shots))) + if i not in self._cache: + cap, im, p = self.shots[i] + img = canvas() + heading(img, "Verify web app", f"{cap} ({i + 1}/{len(self.shots)})") + box = (60, 150, W - 60, SUB_TOP - 60) + if im is None: + placeholder(img, box, "UI screenshot", f"{cap}: screenshot to be supplied at {rel(p)}") + else: + paste_fit(img, im, box) + self._cache[i] = img + return self._cache[i].copy() + + +class ImageScene(Scene): + def prepare(self) -> None: + svg = ROOT / self.v["svg"] + self.png = svg_to_png(svg, ROOT / self.v["override_png"]) + self.im = Image.open(self.png).convert("RGB") if self.png else None + if self.png: + self.sources.append(rel(svg)) + else: + self.pending.append(f"PNG of {self.v['svg']}") + self.box = (60, 140, W - 60, SUB_TOP - 20) + self.base = canvas() + heading(self.base, self.v["heading"], rel(svg)) + if self.im is not None and self.v.get("pan") == "vertical": + bw = self.box[2] - self.box[0] + s = bw / self.im.width + self.scaled = self.im.resize((bw, int(self.im.height * s)), Image.LANCZOS) + else: + self.scaled = None + + def frame(self, t: float) -> Image.Image: + img = self.base.copy() + if self.im is None: + placeholder(img, self.box, "Diagram pending", "See video/NEEDS.md") + return img + bh = self.box[3] - self.box[1] + if self.scaled is not None and self.scaled.height > bh: + # hold, pan top -> bottom, hold + u = min(1.0, max(0.0, (t - 1.5) / max(self.duration - 3.0, 1.0))) + u = 0.5 - 0.5 * math.cos(math.pi * u) + y = int(u * (self.scaled.height - bh)) + ImageDraw.Draw(img).rectangle(self.box, fill=(255, 255, 255)) + img.paste(self.scaled.crop((0, y, self.scaled.width, y + bh)), (self.box[0], self.box[1])) + return img + if self._static is None: + paste_fit(img, self.im, self.box, bg=(255, 255, 255)) + self._static = img + return self._static.copy() + + +class TraceScene(Scene): + ROW_H = 46 + + def prepare(self) -> None: + self.trace, self.path = self.ctx["trace"], self.ctx["trace_path"] + if self.path: + self.sources.append(rel(self.path)) + else: + self.pending.append("agent trace JSON under results/agent_traces/") + self.base = canvas() + planner = "" + if self.trace: + pl = sorted({s.get("planner") for s in self.trace["steps"] if s.get("planner")}) + planner = "planner: " + ", ".join(pl) + synth = self.path is not None and "synthetic" in rel(self.path) + heading(self.base, self.v["heading"], (f"job {self.trace.get('job_id')} · {planner}" if self.trace else "")) + if synth: + tag(self.base, (W - 380, 100), "SYNTHETIC test clip", size=22) + if self.path: + source_line(self.base, "source: " + rel(self.path), y=SUB_TOP - 40) + self.table: Image.Image | None = None + if self.trace: + rows = [] + for s in self.trace["steps"]: + out = s.get("output_summary") or "" + snr = _snr(s) + extra = f"band SNR {fmt(snr)} dB" if snr is not None else "" + if s.get("tool") == "compute_verdict": + try: + extra = "verdict " + str(json.loads(out).get("verdict")) + except json.JSONDecodeError: + pass + rows.append((str(s.get("index")), str(s.get("tool")), str(s.get("decision_reason") or ""), + extra, s.get("policy_note") or "")) + th = self.ROW_H * (len(rows) + 1) + 20 + tab = Image.new("RGB", (W - 120, th), PANEL) + d = ImageDraw.Draw(tab) + cols = [20, 110, 470, 1420] + for c, hname in zip(cols, ["step", "tool", "decision reason", "measured output"], strict=True): + d.text((c, 10), hname, font=font(26, "bold"), fill=ACCENT) + for i, (idx, tool, reason, extra, pol) in enumerate(rows): + y = 10 + self.ROW_H * (i + 1) + hl = reason.startswith("B") and ":" in reason[:4] + if hl: + d.rectangle([0, y - 4, tab.width, y + self.ROW_H - 6], fill=(60, 52, 24)) + ym = y + (self.ROW_H - 10) // 2 + d.text((cols[0], ym), idx, font=font(24, "mono"), fill=FG, anchor="lm") + d.text((cols[1], ym), tool, font=font(24, "mono"), fill=FG, anchor="lm") + r = reason if not pol else f"{reason} [policy: {pol}]" + r = r if d.textlength(r, font=font(24)) < 920 else r[:78] + "…" + d.text((cols[2], ym), r, font=font(24), fill=FG, anchor="lm") + d.text((cols[3], ym), extra, font=font(24, "mono"), fill=FG, anchor="lm") + self.table = tab + + def frame(self, t: float) -> Image.Image: + img = self.base.copy() + box = (60, 150, W - 60, SUB_TOP - 60) + if self.table is None: + placeholder(img, box, "Agent trace: see results", "No agent trace file under results/ yet.") + return img + bh = box[3] - box[1] + if self.table.height <= bh: + img.paste(self.table, (box[0], box[1])) + else: + u = min(1.0, max(0.0, (t - 2.0) / max(self.duration - 4.0, 1.0))) + y = int(u * (self.table.height - bh)) + img.paste(self.table.crop((0, y, self.table.width, y + bh)), (box[0], box[1])) + return img + + +class ResultsScene(Scene): + def prepare(self) -> None: + self.res = self.ctx["results"] + + def static(self) -> Image.Image: + img = canvas() + heading(img, self.v["heading"], "Values read from files under results/ · each line shows its source") + d = ImageDraw.Draw(img) + x, y = 60, 160 + f_h, f_r, f_s = font(32, "bold"), font(28), font(20, "mono") + + def section(title: str) -> None: + nonlocal y + d.text((x, y), title, font=f_h, fill=ACCENT) + y += 50 + + def line(k: str, v: str, src: str) -> None: + nonlocal y + d.text((x + 20, y), k, font=f_r, fill=MUTED) + d.text((x + 640, y), v, font=font(28, "bold"), fill=FG) + d.text((x + 1100, y + 6), src, font=f_s, fill=MUTED) + y += 42 + + section("Evaluation (results/eval/**/summary.json)") + if not self.res["eval"]: + line("Evaluation summary", "Results pending", "no summary.json yet") + self.pending.append("results/eval//summary.json") + for p, j in self.res["eval"][:1]: + self.sources.append(rel(p)) + keys = ["false_contradicted_rate", "verified_coverage_capture", "inconclusive_rate_stock"] + shown = 0 + for k in keys: + if isinstance(j, dict) and k in j: + line(k, fmt(j[k]), f"{rel(p)}#{k}") + shown += 1 + if not shown and isinstance(j, dict): + for k, val in list(j.items())[:6]: + if isinstance(val, (int, float, str)): + line(k, fmt(val), f"{rel(p)}#{k}") + if isinstance(j, dict) and j.get("label"): + line("label", str(j["label"]), f"{rel(p)}#label") + y += 20 + section("Benchmark (results/bench/**/summary.json, cost.json, parity.json)") + if not self.res["bench_summary"]: + line("Benchmark summary", "Results pending", "no summary.json yet") + self.pending.append("results/bench//summary.json") + for p, j in self.res["bench_summary"][:3]: + if not isinstance(j, dict): + continue + self.sources.append(rel(p)) + cfg = j.get("config", p.parent.name) + line(f"config '{cfg}': machine", f"{j.get('machine')} · OpenCV {j.get('opencv_version')}", f"{rel(p)}#machine") + tp = (j.get("throughput_video_s_per_wall_s") or {}).get("mean") + if tp is not None: + line(f"config '{cfg}': throughput", f"{fmt(tp)} video s / wall s", + f"{rel(p)}#throughput_video_s_per_wall_s.mean") + if j.get("runs") is not None: + line(f"config '{cfg}': runs", fmt(j.get("runs")), f"{rel(p)}#runs") + if "test" in str(cfg).lower() or "local" in str(p).lower(): + d.text((x + 20, y), "This is a local test run, not the A/B/C COOL comparison.", + font=font(24), fill=ACCENT) + y += 40 + for key, nm in [("bench_cost", "Cost per video hour (cost.json)"), ("bench_parity", "Parity report (parity.json)")]: + if not self.res[key]: + line(nm, "Results pending", f"no {nm.split('(')[1][:-1]} yet") + self.pending.append(f"results/bench//{nm.split('(')[1][:-1]}") + for p, j in self.res[key][:1]: + self.sources.append(rel(p)) + if isinstance(j, dict): + for k, val in list(j.items())[:4]: + if isinstance(val, (int, float, str, bool)): + line(f"{nm.split(' (')[0]}: {k}", fmt(val), f"{rel(p)}#{k}") + return img + + +class BulletsScene(Scene): + def static(self) -> Image.Image: + img = canvas() + heading(img, self.v["heading"], "from " + self.v.get("source", "")) + self.sources.append(self.v.get("source", "")) + d = ImageDraw.Draw(img) + y = 180 + for b in self.v["bullets"]: + lines = wrap_px(d, b, font(38), 1650) + d.text((80, y), "\u2022", font=font(38), fill=ACCENT) + for i, ln in enumerate(lines): + d.text((120, y + i * 50), ln, font=font(38), fill=FG) + y += 50 * len(lines) + 22 + return img + + +class TeamScene(Scene): + def prepare(self) -> None: + self.path = ROOT / self.v["file"] + self.clip = None + if self.path.exists(): + self.clip = Clip(self.path) + self.sources.append(rel(self.path)) + wav = BUILD / "team_audio.wav" + r = subprocess.run(["ffmpeg", "-y", "-v", "error", "-i", str(self.path), "-vn", "-ac", "1", "-ar", "22050", + "-c:a", "pcm_s16le", str(wav)], check=False) + if r.returncode == 0 and wav.exists(): + self.audio_override = wav + self.clip_dur = self.clip.n / self.clip.fps if self.clip.n else 0.0 + else: + self.pending.append(f"team clip {self.v['file']}") + warn(f"team clip missing: {self.v['file']} (card shown)") + + def frame(self, t: float) -> Image.Image: + if self.clip is None: + if self._static is None: + img = canvas() + placeholder(img, (60, 120, W - 60, SUB_TOP - 40), "Team", "Team clip to be supplied at video/assets/team.mp4") + self._static = img + return self._static.copy() + img = canvas() + f = self.clip.frame_at(min(t, max(self.clip_dur - 0.05, 0))) + if f is not None: + paste_fit(img, f, (0, 0, W, H)) + return img + + +RENDERERS = {"title": TitleScene, "public_clip": PublicClipScene, "engine_run": EngineRunScene, "plots": PlotsScene, + "ui": UIScene, "image": ImageScene, "trace": TraceScene, "results": ResultsScene, + "bullets": BulletsScene, "team": TeamScene} + + +# ----------------------------------------------------------------------------------------------- subtitles +def sub_chunks(text: str, max_chars: int = 95) -> list[str]: + sents = re.split(r"(?<=[.!?])\s+", text.strip()) + out: list[str] = [] + for s in sents: + if len(s) <= max_chars: + out.append(s) + continue + parts = re.split(r"(?<=,)\s+", s) + cur = "" + for p in parts: + if cur and len(cur) + len(p) + 1 > max_chars: + out.append(cur) + cur = p + else: + cur = (cur + " " + p).strip() + if cur: + out.append(cur) + return [c for c in out if c] + + +def draw_sub(img: Image.Image, text: str) -> None: + d = ImageDraw.Draw(img) + f = font(36) + lines = wrap_px(d, text, f, 1720)[:2] + y0 = SUB_TOP + (2 - len(lines)) * 22 + d.rectangle([0, SUB_TOP - 6, W, H], fill=(0, 0, 0)) + for i, ln in enumerate(lines): + d.text((W // 2, y0 + 30 + i * 48), ln, font=f, fill=(255, 255, 255), anchor="mm") + + +# ----------------------------------------------------------------------------------------------- main +def pick_narration(spec: dict[str, Any], ctx: dict[str, Any]) -> str: + nb = spec.get("narration_by") + if nb: + src = nb["source"] + if src.startswith("verdict:"): + key = ctx["runs"][src.split(":", 1)[1]].verdict or "default" + elif src == "trace": + key = trace_kind(ctx["trace"]) + else: + raise SystemExit(f"unknown narration_by source {src}") + text = nb["options"].get(key) or nb["options"]["default"] + else: + text = spec["narration"] + return " ".join(text.split()).format(**ctx["placeholders"]) + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--rerun-engine", action="store_true", help="re-run all engine jobs") + ap.add_argument("--scenes", default=str(VIDEO_DIR / "scenes.yaml")) + ap.add_argument("--out", default=str(OUT_MP4)) + ap.add_argument("--no-engine", action="store_true", help="do not start missing engine runs") + ap.add_argument("--preview", default=None, help="write one PNG per scene to this folder and stop") + args = ap.parse_args() + + cfg = yaml.safe_load(Path(args.scenes).read_text(encoding="utf-8")) + BUILD.mkdir(parents=True, exist_ok=True) + + runs = ensure_runs(cfg["engine_runs"], args.rerun_engine, args.no_engine) + trace, trace_path = find_agent_trace() + planners = sorted({s.get("planner") for s in (trace or {}).get("steps", []) if s.get("planner")}) + if planners == ["bedrock"]: + planner_phrase = "Its planner is Claude on Amazon Bedrock, as in the trace you just saw." + elif planners: + planner_phrase = ("Its planner can be Claude on Amazon Bedrock. The trace you saw used the fixed " + "fallback planner.") + else: + planner_phrase = "Its planner can be Claude on Amazon Bedrock, with a fixed fallback planner." + ctx = {"cfg": cfg, "runs": runs, "trace": trace, "trace_path": trace_path, "results": collect_results(), + "placeholders": {"planner_phrase": planner_phrase}} + + # narration + audio per scene + plan = [] + for spec in cfg["scenes"]: + text = pick_narration(spec, ctx) + lint_narration(spec["id"], text) + plan.append({"spec": spec, "text": text}) + for p in plan: + p["wav"] = tts(p["text"]) + a, sr = read_wav(p["wav"]) + p["audio"], p["sr"] = a, sr + p["speech_s"] = len(a) / sr + + scenes: list[Scene] = [] + for p in plan: + cls = RENDERERS[p["spec"]["visual"]["type"]] + scenes.append(cls(p["spec"], ctx)) + + # durations: max(narration + padding, min_s); shrink minimums if the total is too long + need = [] + for p, sc in zip(plan, scenes, strict=True): + if sc.audio_override is not None: + a, sr = read_wav(sc.audio_override) + p["audio"], p["sr"] = a, sr + p["speech_s"] = len(a) / sr + p["lead"] = 0.0 + need.append(max(p["speech_s"], getattr(sc, "clip_dur", 0.0))) + else: + p["lead"] = LEAD_S + need.append(LEAD_S + p["speech_s"] + TAIL_S) + mins = [float(p["spec"].get("min_s", 0)) for p in plan] + scale = 1.0 + for _ in range(50): + durs = [max(n, m * scale) for n, m in zip(need, mins, strict=True)] + if sum(durs) <= TARGET_MAX_S or scale <= 0: + break + scale -= 0.02 + if sum(durs) > LIMIT_S: + raise SystemExit(f"narration alone is {sum(need):.1f} s; shorten scenes.yaml narration (limit {LIMIT_S} s)") + durs = [math.ceil(d * FPS) / FPS for d in durs] + for sc, d in zip(scenes, durs, strict=True): + sc.duration = d + total = sum(durs) + print(f"[plan] {len(scenes)} scenes, total {total:.1f} s (minimum scale {scale:.2f})", flush=True) + if args.preview: + pv = Path(args.preview) + pv.mkdir(parents=True, exist_ok=True) + for k, (p, sc, d) in enumerate(zip(plan, scenes, durs, strict=True)): + for frac in (0.1, 0.6): + img = sc.frame(d * frac) + draw_sub(img, sub_chunks(p["text"])[0]) + img.save(pv / f"{k:02d}_{p['spec']['id']}_{int(frac * 100)}.png") + print(f" {p['spec']['id']:<16} {d:6.1f} s {p['text'][:70]}") + return 0 + + # audio track + sr_out = 48000 + track = np.zeros(int(round(total * sr_out)) + sr_out, dtype=np.float32) + t = 0.0 + for p, d in zip(plan, durs, strict=True): + a = resample(p["audio"], p["sr"], sr_out) + i0 = int(round((t + p["lead"]) * sr_out)) + a = a[: max(0, int(d * sr_out) - int(p["lead"] * sr_out))] + track[i0:i0 + len(a)] += a + t += d + track = track[: int(round(total * sr_out))] + wav_out = BUILD / "narration.wav" + with wave.open(str(wav_out), "wb") as w: + w.setnchannels(1) + w.setsampwidth(2) + w.setframerate(sr_out) + w.writeframes((np.clip(track, -1, 1) * 32767).astype(np.int16).tobytes()) + + # video frames -> ffmpeg (H.264), then mux audio + silent = BUILD / "video_noaudio.mp4" + ff = subprocess.Popen(["ffmpeg", "-y", "-v", "error", "-f", "rawvideo", "-pix_fmt", "rgb24", "-s", f"{W}x{H}", + "-r", str(FPS), "-i", "-", "-c:v", "libx264", "-preset", "medium", "-crf", "20", + "-pix_fmt", "yuv420p", str(silent)], stdin=subprocess.PIPE) + assert ff.stdin is not None + srt_lines = [] + t_global = 0.0 + for k, (p, sc, d) in enumerate(zip(plan, scenes, durs, strict=True)): + print(f"[render] {k + 1:2d}/{len(scenes)} {p['spec']['id']:<16} {d:6.1f} s", flush=True) + chunks = sub_chunks(p["text"]) + weights = np.array([max(len(c), 1) for c in chunks], dtype=np.float64) + speech = p["speech_s"] if sc.audio_override is None else 0.0 + bounds = p["lead"] + np.concatenate([[0], np.cumsum(weights) / weights.sum() * speech]) + for ci, c in enumerate(chunks): + if speech > 0: + srt_lines.append((t_global + bounds[ci], t_global + bounds[ci + 1], c)) + nfr = int(round(d * FPS)) + for fi in range(nfr): + ts = fi / FPS + img = sc.frame(ts) + if speech > 0: + ci = int(np.searchsorted(bounds, ts, side="right")) - 1 + ci = min(max(ci, 0), len(chunks) - 1) + if ts <= bounds[-1] + TAIL_S: + draw_sub(img, chunks[ci]) + ff.stdin.write(img.tobytes()) + t_global += d + ff.stdin.close() + if ff.wait() != 0: + raise SystemExit("ffmpeg video encode failed") + + out = Path(args.out) + out.parent.mkdir(parents=True, exist_ok=True) + subprocess.run(["ffmpeg", "-y", "-v", "error", "-i", str(silent), "-i", str(wav_out), "-c:v", "copy", + "-c:a", "aac", "-b:a", "160k", "-shortest", "-movflags", "+faststart", str(out)], check=True) + + # sidecar subtitles file (same text as the burned-in subtitles) + def ts_(x: float) -> str: + ms = int(round(x * 1000)) + return f"{ms // 3600000:02d}:{ms // 60000 % 60:02d}:{ms // 1000 % 60:02d},{ms % 1000:03d}" + + (out.with_suffix(".srt")).write_text("\n".join(f"{i + 1}\n{ts_(a)} --> {ts_(b)}\n{c}\n" + for i, (a, b, c) in enumerate(srt_lines)), encoding="utf-8") + + manifest = { + "output": rel(out), "duration_planned_s": round(total, 3), + "scenes": [{"id": p["spec"]["id"], "start_s": round(sum(durs[:i]), 2), "duration_s": round(durs[i], 2), + "narration": p["text"], "visual": p["spec"]["visual"]["type"], "sources": sc.sources, + "pending": sc.pending} + for i, (p, sc) in enumerate(zip(plan, scenes, strict=True))], + "engine_runs": {n: {"verdict": r.verdict, "lifecycle_state": (r.result or {}).get("lifecycle_state"), + "reasons": (r.result or {}).get("reasons"), + "result_file": rel(r.result_path) if r.result_path else None, + "synthetic": r.synthetic} for n, r in runs.items()}, + "agent_trace": rel(trace_path) if trace_path else None, + "warnings": WARNINGS, + } + (OUT_DIR / "manifest.json").write_text(json.dumps(manifest, indent=1), encoding="utf-8") + + r = subprocess.run([PY, str(ROOT / "scripts" / "check_video_duration.py"), str(out)], cwd=ROOT, check=False) + print(f"[done] {rel(out)} planned {total:.1f} s; {len(WARNINGS)} warning(s)") + for w_ in WARNINGS: + print(" - " + w_) + return r.returncode + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/video/run_engine.py b/video/run_engine.py new file mode 100644 index 0000000..c435b09 --- /dev/null +++ b/video/run_engine.py @@ -0,0 +1,61 @@ +"""Run the GRIDPRINT engine (run_default, render=True) on one clip for the submission video. + +Usage (from repo root): + PYTHONPATH=".;engine" python video/run_engine.py