Skip to content

Close frame capture by default and state which frames each turn actually inspected - #262

Closed
devhims wants to merge 13 commits into
mainfrom
fix/cross-video-frame-access
Closed

devhims wants to merge 13 commits into
mainfrom
fix/cross-video-frame-access

Conversation

@devhims

@devhims devhims commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Problem / Motivation

A user can ask the Agent to re-inspect a saved 0:30 frame and capture only 1:00. Previously, the Agent could request 0:30 again and say it had reused the saved image. A provider request alone cannot establish whether the backend fetched new bytes.

What changed

The router checks each proposed operation against the user's timestamps and videos. Classification retries and resumed turns use the same permission checks. A failed saved inspection leaves a gap and the authorized capture can continue. The answer reports the operations recorded during the turn.

When an answer requires images, the router retries a plan that omits image access. A storyboard comparison keeps the permitted times on each video. The tool checks each selection before evidence lookup or billing. Answers identify earlier frame observations from their citations, including on history-only turns.

%%{init: {"themeVariables":{"signalColor":"#64748b","sequenceNumberColor":"#ffffff"}}}%%
sequenceDiagram
    autonumber
    participant A as Agent
    participant S as Saved images
    participant P as Image provider
    A->>S: Inspect saved 0:30
    S-->>A: Image unavailable
    alt Before
        A->>P: Request 0:30 again
    else With this change
        A->>P: Request only 1:00
        A-->>A: Record the 0:30 gap and 1:00 result
    end
Loading

The example shows the provider requests after saved inspection fails.

Tests

Provider-level regressions cover extra timestamps, prohibited recapture, cross-video assignments, and targeted storyboard sheets. The platform unit suite passed 2,371 tests with 67 skipped. The runtime integration suite passed 521 tests. TypeScript and generated documentation checks passed.

Compatibility

Existing single-video frame plans remain readable. Rolling back requires draining in-flight runs that use the newer permission shapes. A live production replay remains pending.

… reported

A saved frame on one video plus a capture on another could not be expressed with
single-video frame access. In production the route was scoped to the new video,
the saved frame was never re-inspected, and the answer said it had been.

Frame access is now one entry per video, every entry must be a route subject
(two videos means a comparison), and the activity report covers every video.
Also: a refresh with no fixed positions runs instead of asking, required captures
are analyzed before completion, app warnings survive the cap, the report is its
own uncited paragraph, saved-only conflicts name frameAccess, and saved frame
positions are read once per run.
@vercel

vercel Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
video2ctx-web Ready Ready Preview Nov 8, 2026 9:16am UTC

devhims commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

Review: changes needed

Reviewed head 1b312d99a19058bf222b18834c6cd79d0a8e7194. The per-video allowlists and cross-video activity report are useful, but two independently reproduced gaps remain:

  1. P2 — Exact capture restrictions are dropped by last-resort routing. capability-router.ts:723–725. With the request “Capture only 0:45 of https://youtu.be/abcdefghijk and describe it. Use the saved 0:30 image for comparison,” and classifier attempts that omit frameAccess, the fallback inserts agent_selected. The resulting route has refreshFramesOnly: true, useStoryboard: true, and no frameAccess allowlist. Absence of the narrow “don't recapture” regex is not permission to choose arbitrary timestamps. Keep fixed requests bounded or clarify when their positions cannot be recovered; reserve unrestricted fallback for positively established open-ended requests. Otherwise users' explicit capture limits can be ignored and unrequested extraction performed.

  2. P2 — An analyzed saved frame lets the new comparison frame skip inspection. research-agent.ts:782–784. In the new cross-video scenario, analyze saved A at 0:30, retrieve B at 1:00 without inline analysis, then call complete_research. Completion succeeds immediately: hasVisualObservations() is already true from A, and topic_research cannot use the inspect-video exact-frame condition. My reproduction expected both A and B analysis calls but observed only A. The report correctly says B was retrieved, but research never inspects B despite the required visual comparison. Gate outstanding required captures per video/position, not on the presence of any visual observation; add this retrieval-only path alongside the existing inline-analysis happy-path test.

Verification: all 2,294 existing platform unit tests passed locally (67 skipped), including 141 router and 57 stored-analysis tests. Both new reviewer regression assertions fail as described. All eight Verify CI jobs for this head passed. Reviewed current description, complete changed-file diff, surrounding enforcement/finalization code and existing discussion; no prior review was duplicated.

Limits: local tests use scripted model/provider responses and prove these control-flow gaps, not production incidence or live classifier quality. No production replay, merge, deployment, implementation or push performed. The original live defect is not established as fixed by this review.

…ivity notes

Folds in the per-version completion tracking, finalizer-owned activity report and
resume guard from #261, and addresses the review of the previous commit:

- A refresh that names positions or forbids recapture now needs a capture list;
  a fallback asks instead of widening it. Open refreshes no longer need one, so
  agent_selected is gone.
- Completion tracks each frame version: one video's inspection no longer stands
  in for another's, and saved frames whose inventory omits the position are tried.
- buildAgentTurnResult appends the activity report and states when a cited frame
  observation comes from an earlier turn and was not re-inspected, which holds
  even when the route omitted that video.
@devhims devhims changed the title Scope frame access per video so cross-video re-inspection is real and reported Scope frame access per video and state which frames each turn actually inspected Nov 7, 2026

devhims commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed updated head 2e577a6098f21eacfeb19b829ef6e3cda32efd73 and its incremental changes.

Resolved: the previous cross-video completion reproduction now passes: analyzing saved A no longer permits completion before newly retrieved B is analyzed. The original 0:45 routing reproduction also now fails closed to clarification. Per-version completion tracking, legacy-inventory coverage and application-owned activity notes are improvements.

P2 remains — equivalent exact-position requests still lose their capture boundary. capability-router.ts:608–620 recognizes only colon timestamps and ms as named positions. Independent tests with classifier output omitting frameAccess reproduce unrestricted inspection for each of:

Actual: accepted on the first classification attempt with refreshFramesOnly: true, useStoryboard: true, and no frameAccess. Expected: preserve the exact capture restriction or clarify, never treat these as delegated open-ended positions. The practical impact is unchanged: the agent can retrieve unrequested frames despite the user's explicit only restriction. Establish open-ended permission positively rather than relying on absence of a narrow timestamp regex; cover normal seconds wording and timestamp links in regression tests.

Verification: all 2,300 existing platform unit tests passed locally (67 skipped). Independent original routing and cross-video-completion regressions now pass; three new equivalent-position routing assertions fail. CI was still in progress at the last check (six jobs succeeded; Platform checks was uploading its artifact and Dashboard E2E other remained running). No CI failure observed.

Limits: scripted classifier/provider tests establish the acceptance and completion behavior, not how often a live model makes the routing error. No production replay or broad live-fix claim. No implementation, push, merge or deployment performed.

- Exact-frame questions need a capture list, not only refreshes, and positions
  given as 'at/only N seconds' count as named positions.
- A saved frame at a time the user names must appear in frameAccess; saved-only
  access lists are allowed and offer no capture tool.
- The answer builder corrects an uncited claim of re-inspection when this turn
  re-inspected no saved frame, and matches earlier observations by asset version.
- A failed capture closes only its own positions; other authorized captures stay
  required before completion.

devhims commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed 55958eab4fec6010e77e7c39f966e6d66e70e93d. The original colon-timestamp reproduction, numeric-seconds wording, and cross-video completion reproduction now pass independently. I also reviewed the new saved-only scope, per-position capture failure tracking, and immutable-version provenance changes.

The prior P2 capture-boundary finding remains for two already-reported forms, at capability-router.ts:610–628:

  • Capture only the linked instant at https://youtu.be/abcdefghijk?t=45 and describe it.
  • Capture only the frame at one minute of https://youtu.be/abcdefghijk and describe it.

With classifier output {route:'inspect_video', videoId:'abcdefghijk', refreshFramesOnly:true, visualEvidence:'required', visualRequirements:['scene']} and no frameAccess, both requests are still accepted on the first attempt as unrestricted inspection (useStoryboard:true, no timestamp allowlist). Neither URL timestamps nor spelled-out positions match FRAME_POSITION. The classifier can omit timestampedFrameQuestion too, so that added check does not close these cases.

Expected: a bounded position list or clarification, not open-ended capture permission. Please cover these two existing regressions and make unrestricted selection depend on positive evidence that positions were delegated, rather than absence of recognized timestamp syntax.

Verification: existing platform unit suite and TypeScript passed locally. Independent regression results: three passed (colon timestamp, numeric seconds, cross-video completion), two failed (above). CI remained in progress at the latest check; no failure observed. These are scripted routing/control-flow reproductions, not live production tests. No implementation, push, merge or deployment performed.

… operations

Review of 55958ea showed that wording-based checks keep leaking:
- New captures are now closed unless the route lists their positions or
  delegates them with agent_selected, so an omitted grant can never widen a
  limit such as 'capture only 1:00'. Refreshes must state a grant; exact-frame
  questions, recapture prohibitions and named positions need a list.
- The time-only saved-frame router check is removed: it lost which video a
  time belonged to and rejected plans that excluded a frame on purpose.
- Every frame turn's answer now carries the application's account built from
  the requested frames, the session inventory and this run's operations: listed
  positions, saved frames re-inspected, or that none was. It no longer depends
  on the answer's wording or citations.
- Earlier-turn notes judge each citation by the exact image behind it, so an
  untouched frame from the same batch no longer changes the note.
@devhims devhims changed the title Scope frame access per video and state which frames each turn actually inspected Close frame capture by default and state which frames each turn actually inspected Nov 7, 2026

devhims commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed 4f38472669a79111ef8d325113bb7753aa01e90a. All five prior independent regression checks now pass: colon timestamps, numeric seconds, timestamp URLs, spelled-out positions, and cross-video completion. Explicit capture permission is a better boundary than inferring permission from timestamp syntax.

P2 — The fail-closed boundary still leaves storyboard image retrieval open. research-agent.ts:465–468 removes get_video_frames when capture permission is absent, but removes get_video_storyboard only when a fixed frameList exists. With no scope, storyboard retrieval remains available.

Independent end-to-end control-flow reproduction:

  1. Request: Capture only 0:45 of https://youtu.be/abcdefghijk. Do not retrieve any other images.
  2. Classifier returns required visual inspection but omits frameAccess, refreshFramesOnly, and timestampedFrameQuestion (the omitted-fields path the new test explicitly permits).
  3. Research calls get_video_storyboard with timestampsMs:[90000].
  4. Actual provider wrapper invokes storyboard retrieval once with metadataOnly:false and resolution:'high'. The expected assertion of no retrieval fails.

This is not merely an offered-tool concern: the retrieval reaches the provider. A storyboard contains additional sampled images, so it can still fetch outside the user's sole authorized position even though exact-frame capture is closed. Apply the no-permission boundary to storyboard image retrieval as well, while retaining already-saved analysis and explicitly delegated open-ended visual work. Add the alternate-tool regression alongside the existing exact-frame-tool check.

Verification: 2,310 existing platform unit tests passed (67 skipped); TypeScript passed. Five prior independent regressions pass, one new alternate-tool boundary test fails. Seven CI jobs passed; Dashboard E2E (other) was still running at the last check. Also reviewed the new application-owned frame notes and per-citation immutable-image matching.

Limits: scripted model responses and a fake provider establish execution behavior; no live extraction or production replay. No implementation, push, merge or deployment performed.

…ate saved images

Review of 4f38472:
- A frameAccess entry without videoId fixes capture times for videos discovery
  will choose, and agent_selected is rejected whenever the message names a
  position, so delegating the video no longer delegates the time.
- Every saved frame at a time the user names must be listed on its own video or
  in setAsideFrames, so a plan that drops the saved half of a comparison is
  retried, and an explicit exclusion is still accepted.
- An image counts as saved when the session stored it before the run started,
  so a capture served from session storage is a re-inspection.
- Citations are placed by the inventory or by single-image packets; when neither
  places one, a partial re-inspection is reported as unrecorded, not as missed.

devhims commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed 7f8cc6b9f862f0a42117e0780677e07c282cf863. The discovery-time allowlist, accounting for named saved frames, and collection-time/citation provenance changes are improvements. Independent routing checks, including fixed-time discovery and rejecting wildcard scopes on single-video inspection, pass. Earlier timestamp-omission and cross-video completion regressions also pass.

The previous P2 storyboard bypass remains unresolved, at research-agent.ts:465–468. The gate is unchanged: absent frameAccess disables get_video_frames, but not get_video_storyboard.

I reran the classifier-to-provider reproduction on this exact head: “Capture only 0:45 of https://youtu.be/abcdefghijk and describe it. Do not retrieve any other images.” A classifier response omitting the frame flags is accepted; a subsequent get_video_storyboard call with timestampsMs:[90000] still invokes the provider once (metadataOnly:false). The no-retrieval assertion fails. Thus the alternate image tool can still bypass the user's sole permitted position. Apply the permission boundary to storyboard image retrieval as well, not just exact-frame capture. Existing saved analysis and explicitly delegated open-ended visual work can remain available.

Verification: 2,317 existing platform unit tests passed, 67 skipped; TypeScript passed. Six independent router checks and the cross-video completion check pass. The independent storyboard boundary assertion fails. At the latest CI check, six jobs succeeded while Platform checks and Dashboard E2E (other) were still running; no CI failure observed.

Limits: these are local scripted-classifier/provider tests, not a production replay or evidence of live incidence. No implementation, push, merge, or deployment performed.

Review of 7f8cc6b found two ways the saved half of a comparison could still be
skipped:
- Times written as quantities ('at 30 seconds', '1m30s', '1 minute 30 seconds')
  now count as named times for the saved-frame check; lengths such as 'a 30
  second clip' do not.
- The session inventory recovers a frame's position from its resource key when
  older rows omitted it, so the router check and completion gate can place it.
When a saved frame still goes unused, the activity note says why: the plan
included none, or the frame has no recoverable position.

devhims commented Nov 8, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed 2257506362d0a9a709c9e4c2e680b8162d49ed5a. The new seconds/compound-time handling for saved frames, legacy resource-key position recovery, and explicit unplaced-frame notices are useful improvements. No additional material issue found in those incremental changes.

The previously reported P2 storyboard permission bypass is still present at research-agent.ts:465–468. I reran the independent classifier-to-provider test against this head: the request “Capture only 0:45 of https://youtu.be/abcdefghijk and describe it. Do not retrieve any other images.” with omitted classifier frame flags still permits get_video_storyboard at timestampsMs:[90000]. The provider is invoked once for image retrieval; the assertion that no out-of-scope retrieval occurs fails. The new commit does not change this gate. Please enforce the permission boundary for storyboard image retrieval too. Until then, the claim that router omission cannot widen a user's image limit is not established.

Verification: 2,319 existing platform unit tests passed (67 skipped), TypeScript passed, and seven prior independent routing/completion checks passed. The storyboard-boundary check failed. CI at last check: five jobs passed; Platform checks and both Dashboard E2E jobs remained in progress. No CI failure observed.

Limits: scripted model/provider tests prove local execution behavior, not production incidence. The legacy-inventory integration test was inspected, not independently run here; Platform integration CI passed. No live replay, implementation, push, merge, or deployment.

The capture-permission check used a narrower pattern than the saved-frame check,
so 'capture only 1m30s' during discovery still accepted agent_selected. Both
checks now share one parser of clock times and spoken quantities, which skips
length bounds such as 'under 5 minutes'. A parity test runs every format through
each check separately.

devhims commented Nov 8, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed 5b90df434d75c7e2c2b622a73da0d015d15eba2e. The unified time parser and compound-timestamp/length-filter tests improve consistency between capture permission and saved-frame accounting.

The existing P2 storyboard bypass remains reproducible. research-agent.ts:465–468 still removes get_video_frames, but not get_video_storyboard, when classification omits frame permission. On this exact head, the independent request “Capture only 0:45 of https://youtu.be/abcdefghijk and describe it. Do not retrieve any other images.” still reaches the storyboard provider once with timestampsMs:[90000] and metadataOnly:false. The no-out-of-scope-retrieval assertion fails. The new parser does not close this alternate-tool execution path; please apply the permission boundary to storyboard image retrieval too.

Verification: 2,327 existing platform unit tests passed (67 skipped), TypeScript passed, and seven independent routing/completion regression checks passed. The storyboard-boundary regression failed. Six CI jobs succeeded; both Dashboard E2E jobs remained running at the last check. No CI failure observed.

Limits: local scripted model/provider execution, not production incidence or a live replay. No implementation, push, merge, or deployment.

devhims commented Nov 8, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed 9f2cea3b4eade0e1a3683bfb2c410595eddc4ff4, including all three commits since 5b90df4: duration-vs-position parsing, start-relative capture-window validation, and local YouTube skill/security documentation. No additional material finding in those changes.

The existing P2 storyboard permission bypass remains unresolved at research-agent.ts:465–468. The independent classifier-to-provider regression still fails: for “Capture only 0:45 of https://youtu.be/abcdefghijk and describe it. Do not retrieve any other images,” classification with omitted frame flags leaves get_video_storyboard callable. A storyboard request at timestampsMs:[90000] invokes the image provider once. Exact-frame capture being closed does not close this alternate image-retrieval path. The new window/parser changes do not alter that tool gate.

Verification: 2,332 existing platform unit tests passed (67 skipped); TypeScript passed. Seven independent routing/completion checks passed; the storyboard-boundary check failed. At the last CI check, four jobs passed and four remained in progress; no CI failure observed. Documentation changes were inspected, not independently built locally.

Limits: local scripted model/provider execution, not a live production replay or incidence estimate. No implementation, push, merge, or deployment.

devhims commented Nov 8, 2026

Copy link
Copy Markdown
Owner Author

Re-review: approve

Reviewed latest head c3709634281c53a429f1677e2ee53546b4e06eeb. The previously reported storyboard bypass is now resolved in the independent reproduction. When classification omits frame permission, the research loop exposes neither exact capture nor storyboard retrieval; an attempted storyboard call no longer reaches the provider. The original “only 0:45; no other images” regression passes.

The explicit storyboard_only permission preserves authorized storyboard overviews without granting exact captures. The added checks reject an unbounded storyboard grant for a recognized exact-position request and preserve scoped exact-frame access. Earlier timestamp-omission, discovery-scope and cross-video completion regressions remain passing. No remaining material finding identified in the reviewed changes.

Verification: eight independent regression checks passed; 2,336 existing platform unit tests passed (67 skipped); TypeScript passed. All eight Verify CI jobs for this exact head completed successfully: https://github.com/devhims/video2ctx/actions/runs/42457477892. Checked current head and discussion before posting; this verdict supersedes my earlier changes-needed verdict for prior heads.

Limits: the independent tests use scripted classifier/provider responses. This is code-review approval, not proof of live router quality or a production fix. A scoped post-deployment replay is still needed for the original cross-video re-inspection scenario, including retained-frame provenance, visible activity reporting, and actual image-retrieval behavior. No implementation, push, merge, or deployment performed.

devhims commented Nov 8, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed 49b7b36c5abc065eb9581bf684cf72cd158b603b. The previous omitted-permission storyboard bypass remains fixed; all eight earlier independent regression checks pass. The new request parser exposes two additional gaps:

  1. P2 — Numeric seek URLs do not constrain explicit capture grants. frame-request.ts:65–79 recognizes clock/unit strings inside URLs, but not the common numeric ?t=45 form. For Capture only the linked instant at https://youtu.be/abcdefghijk?t=45 and describe it., a classifier grant for captureTimestampsMs:[90000] is accepted unchanged. The full-classifier regression fails; watch?v=abcdefghijk&t=45 fails the parser check too, while ?t=45s is recognized. Expected: 45 seconds or clarification, never permission for 90 seconds. Parse supported YouTube numeric seek parameters as seconds when the surrounding request supplies no overriding position. This is distinct from the earlier fixed omission case: here an explicit but wrong grant passes the new request validator and becomes the tool's allowlist.

  2. P2 — Ordinary saved/new comparison wording rejects a correct plan. frame-request.ts:36–42,58–60. Request: Compare the saved 0:30 frame of https://youtu.be/abcdefghijk with a new 1:00 frame from https://youtu.be/lmnopqrstuv. The parser treats both timestamps as saved and associates both videos with both positions: with does not delimit the operations, and new 1:00 frame does not match the capture-role expression. A correctly supplied [A saved30, B capture60] plan is rejected; repeatedly supplying that correct plan ends in clarification in the full classifier. This blocks the PR's core comparison use case even when the model selects the right operations. Preserve the local operation/subject association and cover this natural wording.

Verification: 2,347 existing platform unit tests passed (67 skipped), TypeScript passed, and the eight prior independent checks passed. New full-classifier assertions fail for both findings; parser-level checks corroborate them. Seven CI jobs passed at the last check; Dashboard E2E (other) was still running. No CI failure observed.

Limits: scripted local classifier/parser tests, not a live production replay or incidence claim. No implementation, push, merge, or deployment. My prior approval applied to c3709634; this new-head verdict supersedes it.

devhims commented Nov 8, 2026

Copy link
Copy Markdown
Owner Author

Re-review: approve

Reviewed latest head eb593e42b038ea41403677752ad58fb9f651b642. Both P2 findings from 49b7b36 now pass independently:

  • Numeric YouTube seek links (?t=45, including watch URLs) constrain the requested capture to 45 seconds; a contradictory 90-second classifier grant no longer passes. URL parsing also handles supported start/hash/unit forms while retaining explicit prose-position precedence.
  • The ordinary “Compare the saved 0:30 frame of A with a new 1:00 frame from B” request accepts the correct saved-A/new-B plan. The new clause boundary and capture-role handling preserve the requested video/operation pairing.

Earlier omission, storyboard permission, discovery scope and cross-video completion regressions remain passing. No remaining material finding identified in this review.

Verification: all 15 independent regression assertions passed; 2,356 existing platform unit tests passed (67 skipped); TypeScript passed. All eight Verify CI jobs completed successfully for this exact head: https://github.com/devhims/video2ctx/actions/runs/42462757219. Current head and existing discussion checked before posting. This approval supersedes the changes-needed verdict on 49b7b36.

Limits: local tests use scripted classifier/provider behavior. Approval is not a claim that every natural-language formulation is handled, or that the original production behavior is fixed. A scoped post-deployment replay remains needed for saved/new cross-video inspection, actual capture boundaries, citations and application-owned activity notes. No implementation, push, merge, or deployment performed.

devhims commented Nov 8, 2026

Copy link
Copy Markdown
Owner Author

Re-review: changes needed

Reviewed a0d447c30f376cdca5c07ed876b508d908facd0c. Prior storyboard, numeric seek-URL and saved/new comparison findings remain fixed. The omitted-permission path now safely clarifies earlier; independent comparison-storyboard pairing also passes. Reviewed the new retrieval permissions, sheet refresh/completion and frame-provenance changes.

P2 — Compound hour/minute positions are split into two different capture grants. frame-request.ts:11 permits an optional seconds component after a unit, but not minutes after hours. For Capture only the frame at 1 hour 30 minutes of https://youtu.be/abcdefghijk., the parser produces separate capture positions 3600000 and 1800000, rather than the requested 5400000.

Independent checks show both consequences: the correct 90-minute grant is rejected by frameRequestIssue, while the full classifier accepts a wrong [3600000,1800000] grant unchanged. Thus a normal long-video request can authorize two unintended frames and reject the intended one. Parse compound quantities as one position (or clarify without granting the split interpretation), with tests for hours/minutes and hours/minutes/seconds.

This is a newly identified remaining defect in the PR's parser, not a regression introduced specifically by this latest commit; it also exists in earlier PR heads. My earlier approval did not cover this formulation.

Verification: 2,371 existing platform unit tests passed (67 skipped), TypeScript passed. Sixteen independent assertions passed, including the previous regressions and storyboard pairing; two new assertions fail for the compound-time defect (parser and full classifier). Seven CI jobs passed; Dashboard E2E (other) remained running at the last check. No CI failure observed.

Limits: local scripted classifier/parser tests, not a live provider request or production incidence claim. No implementation, push, merge, or deployment.

This branch was successfully deployed

1 active deployment
Preview — a0d447c3 Deployed Nov 8, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant